作为使用Shiny运行时的替代方案,您还可以使用
Shiny Gadgets与
自定义Knit按钮行为相结合(据我理解,这在您
使用“带参数编织”时主要发生)。
您需要两个东西:运行小工具的函数和编织时运行的函数。
该小工具本质上是一个Shiny应用程序,但您可以使用
miniUI
中的专门UI元素。作为迷你应用程序,您可以做很多事情,但这是一个基本实现。
library(shiny)
library(miniUI)
get_file_param <- function(){
ui <- miniPage(
miniContentPanel(
fileInput("dateFile", "Date File")
),
miniTitleBar(
NULL,
right = miniButtonBlock(
miniTitleBarCancelButton(),
miniTitleBarButton("done", "Done", primary = TRUE))
)
)
server <- function(input, output, session){
observeEvent(input$done, {
stopApp(input$dateFile)
})
}
runGadget(
app = ui,
server = server,
viewer = paneViewer()
)
}
knit函数将调用小工具,然后在调用rmarkdown::render时使用其输出
knit_with_file <- function(input, ...){
fileInfo <- get_file_param()
rmarkdown::render(
input,
params = list(
date_file = list(name = fileInfo$name, datapath = fileInfo$datapath)
),
envir = globalenv()
)
}
为了自定义编织按钮,您需要在文档YAML头中的
knit
字段提供一个函数。R Markdown Cookbook建议您将其放入软件包中,但我将上述两个函数都放在文件(“knitFx.R”)中,rmarkdown文档将从中获取源代码。
---
title: "Untitled"
date: "11/16/2021"
output: html_document
params:
date_file: 'dates.tsv'
knit: (function(input, ...) {
source("knitFx.R")
knit_with_file(input, ...)
})
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## R Markdown
**Original Name of Uploaded File**: *`r params$date_file$name`*
**Local Temp File Path**: *`r params$date_file$datapath`*
当用户点击“Knit”时,将显示一个UI以选择文件。根据上述实现,
name
和
datapath
将可用于在rmarkdown文档中使用。
以下是呈现的HTML文档:
rmarkdown::render
。这意味着你不能从自己的会话中使用debug
进入函数调用。如果你在这里找不到满意的答案,那么在他们的GitHub上提出问题可能是值得的,或者在他们的GitHub上说要提出问题的地方。 - Mikael Jagan