我想使用 Shiny 应用程序以交互方式设置一些变量。我不想在脚本顶部定义一些对象/变量,而是想启动一个应用程序并使用滑块/textInputs/radioButtons 来定义它们的值。我想这样做,以便我可以在下游使用这些变量,就像人们可能使用类似的东西
readline(prompt = "Choose a value for your variable: ")
我可以想象的这个用例的最小闪亮应用程序如下所示:
library(shiny)
ui <- fluidPage(
h3("Set the value for downstream analysis!"),
sliderInput(inputId = "value", label="Value", min = 0, max = 10, value = 1),
actionButton(inputId = "endsession", label = "Send to R")
)
server <- function(input, output){
observeEvent(input$endsession, {
# value_from_shiny <<- input$value
assign("value_from_shiny", input$value, envir = .GlobalEnv)
stopApp()
})
}
shinyApp(ui, server)
它可以正确启动应用程序,以交互方式接受输入,并使下游可以访问该输入。然而,这个解决方案(以及我发现的大多数其他解决方案)使用
<<-
或 assign(envir = .GlobalEnv)
选项,由于全局变量的分配,这可能会出现问题。或者,我考虑过将其写入一个临时文件,然后读入并删除,但这仍然感觉有问题。我也可以使用外部环境,但就副作用而言,这些感觉与全球环境存在相同的问题,但可能是最好的选择:
external_env <- environment()
...
assign("value_from_shiny", input$value, envir = external_env)
...
external_env$value_from_shiny
是否有更简单的方法从 Shiny 应用程序返回值?或者这不是他们应该做的,而
<<-
方法是我能得到的最好的方法?我希望将这种交互性构建到一个包中,其中该方法用于交互式地对数据集进行分类,因此我希望它相当健壮并且至少通过 CRAN 检查。我梦想的用例是应用程序的输出可以像普通变量一样返回并访问:
value_from_shiny <- shinyApp(ui, server)
但我也意识到这根本不是shinyApp 的工作原理。
您可以将想要返回的值放入
stopApp
,然后使用runApp
获取。
library(shiny)
ui <- fluidPage(
h3("Set the value for downstream analysis!"),
sliderInput(inputId = "value", label="Value", min = 0, max = 10, value = 1),
actionButton(inputId = "endsession", label = "Send to R")
)
server <- function(input, output){
observeEvent(input$endsession, {
stopApp(input$value)
})
}
runApp(shinyApp(ui, server))