R Shiny:"全球" server.R中所有函数的变量

时间:2015-07-17 18:30:24

标签: r scope shiny

我把全局放在引号中,因为我不希望ui.R可以访问它,只能访问server.R中的每个函数。这就是我的意思:

shinyServer(function(input, output, session) {
  df <- NULL
  in_data <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)     
    else df <<- read.csv(inFile$datapath, as.is=TRUE)  
    return(NULL)
   })
  output$frame <- renderTable({
    df
  })
})

shinyUI(pageWithSidebar(
   sidebarPanel(fileInput("file1", "Upload a file:",
                           accept = c('.csv','text/csv','text/comma-separated-values,text/plain'),
                           multiple = F),),
   mainPanel(tableOutput("frame"))
))

我在shinyServer函数的开头定义了df,并尝试使用in_data()赋值在<<-中更改其全局值。但df永远不会更改其NULL作业(因此output$frame中的输出仍为NULL)。有没有办法在shinyServer中的函数中更改df的整体值?我想在server.R中的所有函数中使用df作为上传数据框,这样我只需要调用input$file一次。

我查看this帖子,但是当我尝试类似的东西时,错误被抛出,envir = .GlobalENV没有找到。总体目标是仅调用input$file一次并使用存储数据的变量,而不是重复调用in_data()

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

使用被动反应的想法是正确的方向;但是你做得不对。我刚刚添加了一行,它正在运行:

shinyServer(function(input, output, session) {
  df <- NULL
  in_data <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)     
    else df <<- read.csv(inFile$datapath, as.is=TRUE)  
    return(NULL)
  })
  output$frame <- renderTable({
    call.me = in_data()   ## YOU JUST ADD THIS LINE. 
    df
 })
})

为什么呢?因为反应对象与函数非常相似,只有在调用它时才会执行。因此,代码的“标准”方式应该是:

shinyServer(function(input, output, session) {
  in_data <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)     
    else read.csv(inFile$datapath, as.is=TRUE)  
  })
  output$frame <- renderTable({
    in_data()
  })
})