【发布时间】:2020-01-16 02:25:01
【问题描述】:
我想将 r 代码(在激活操作按钮时进行评估)与相应的用户输入一起导出为 r 脚本。
抱歉,如果我不准确或者这个问题已经在其他地方提出过,但我不熟悉要搜索的正确术语和关键字。
我有以下 UI (similar to this app) 并添加了一个操作按钮:
library(shiny)
library(dplyr)
ui <- fluidPage(
fluidRow(
column(4,
selectInput(
"var",
"Variables:",
c("All", colnames(iris)),
selected = c("Sepal.Length","Petal.Length"),
multiple = T)
),
column(4,
textInput("filter",
"Filter Data",
value = "Sepal.Length < 5"))
),
DT::dataTableOutput("table"),
actionButton("script",
"Save script")
)
我们的想法是使用标准 r / dplyr 语法和准引用 (reference) 让数据集中的用户 select 列 (iris) 和 filter 它
server <- function(input, output){
dat <- reactive({
data <- iris
if(!input$var %in% "All"){
data <- data %>% select(input$var)
}
if(input$filter != ""){
data <- data %>% filter(!!rlang::parse_expr(input$filter))
}
data
})
output$table <- DT::renderDataTable(DT::datatable(dat()))
# insert code below here
}
shinyApp(ui, server)
这按预期工作。但是,我想导出 r 代码,它提供所需的输出并将其保存在新的 r 文件中。也就是说,按下操作按钮后,代码将被打印 (cat) 并且用户输入 (input) 会填充空白:
observeEvent(input$script, {
cat('#this is an automatically generated r script
data <- iris
if(!',paste0("c(",paste(paste0('"',input$var, '"'), collapse = ","), ")"), '%in% "All"){
data <- data %>% select(',paste(input$var, collapse = ","),')
}
if(',paste0("c(",paste(paste0('"',input$filter, '"'), collapse = ","), ")"),' != ""){
data <- data %>% filter(',input$filter,')
}', file = "r_script.r")
})
这种可憎的代码实际上正在运行,生成的 r_script.r 文件包含以下代码:
#this is an automatically generated r script
data <- iris
if(! c("Sepal.Length","Petal.Length") %in% "All"){
data <- data %>% select( Sepal.Length,Petal.Length )
}
if( c("Sepal.Length < 5") != ""){
data <- data %>% filter( Sepal.Length < 5 )
}
我的问题是:是否有更简单的方法来访问服务器上运行的底层代码并将其导出为 r 脚本,最好使用已评估的 if 语句:
#this is an automatically generated r script
data <- iris
data <- data %>% select( Sepal.Length,Petal.Length )
data <- data %>% filter( Sepal.Length < 5 )
非常感谢任何帮助!
【问题讨论】:
-
这个有一个包,叫做shinymeta。我认为它还没有在 CRAN 上,所以你必须使用 GitHub version。
-
@TimTeaFan 感谢您的评论并让我注意到这个包。仅演示看起来就很有希望!
标签: r shiny datatables dplyr rlang