我正在创建一个包含一些交互式闪亮应用的包。这些应用程序的目的是促进对内存中对象的GUI探索。例如,我有一个由离散变量组成的对象,我想传递给闪亮的应用程序,然后通过GUI界面进行调整。
但是,当我试图从Shiny App访问这个内存中对象时,我遇到了麻烦。
以下是相关代码:
首先,我将shinyServer
函数包装在另一个函数中。我的想法是让闪亮的服务器访问传递的对象。
#' @export
appServer <- function(bins) {
su <- summary(bins)
shinyServer(function(input, output) {
## values that should trigger updates when changed
values <- reactiveValues(summary=su, i=1, bins=bins)
# excluded rest of body for brevity ...
}
在这个函数中,我创建一个shinyApp
对象并传入ui(在另一个文件中)和上面定义的appServer
函数的结果。
makeApp <- function(bins) {
shiny::shinyApp(
ui = appUI,
server = appServer(bins))
}
在此函数中调用上述函数,该函数将对runApp
的调用包装起来并从用户处获取参数。
#' @export
adjust <- function(bins) {
## access data from the app?
app <- makeApp(bins)
shiny::runApp(app)
}
如何将内存中对象传递给从另一个包导入的shinyApp?
当我执行上面的代码时,收到以下错误:
错误:path [1] =“C:\ Users \ myusername \ AppData \ Local \ Temp \ RtmpWMpvHT \ widgetbinding23e8333e5298”:系统找不到指定的路径
答案 0 :(得分:5)
在下面的示例中,我将演示如何将对象x
从全局环境或任何其他环境传递到闪亮的应用程序并更改其值。我不确定这是否能回答你的问题。无论如何它可能证明是有用的:)
library(shiny)
x <- 5
x
deparse(substitute(x)) # is going to do the trick
fun <- function(obj) {
# get the name of the passed object
object_to_change <- deparse(substitute(obj))
# get the object from a given environment
val <- get(object_to_change, envir = .GlobalEnv)
# ?environment
# Save the object as a reactive value
values <- reactiveValues(x = val)
# Now define the app that is going to change the value of x
ui <- shinyUI(fluidPage(
br(),
actionButton("quit", "Apply changes and quit"),
textInput("new", "", value = NULL, placeholder = "Set new value of x"),
textOutput("out")
))
server <- function(input, output) {
output$out <- renderPrint({
values$x
})
# change the value of x
observe({
req(input$new)
values$x <- as.numeric(input$new)
})
# Apply changes and quit
observe({
if (input$quit == 1) {
assign(x = object_to_change, value = values$x, envir = .GlobalEnv)
stopApp()
}
})
}
# Run the app
shiny::shinyApp(ui, server)
}
fun(x)
# Check the new value of x in the .GlobalEnv
x