【问题标题】:Shiny: Dynamically load .RData fileShiny:动态加载 .RData 文件
【发布时间】:2016-02-05 23:45:36
【问题描述】:

我使用 Shiny 作为界面来查看本地存储在一系列 .RData 文件中的表格,但是我无法让表格呈现。

我的server 代码是这样的:

output$table1 <- renderTable({
load(paste0(input$one,"/",input$two,".RData"))
myData})

在ui 一侧,我只是在主面板中显示表格。

This other SO question 表明问题在于加载数据的环境消失了,因此数据无法显示。他们建议创建一个global 文件并在其中加载.RData 文件,但我不相信我能够以这种方式动态加载数据。任何有关如何在shiny 中有效使用.RData 文件的指导将不胜感激。

问候

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我认为您只需将load 语句移到renderTable 函数之外。所以你应该有

    load(paste0(input$one,"/",input$two,".RData"))
    output$table1 <- renderTable({myData})
    

    如果你查看renderTable 的帮助文件,第一个参数是

    expr:返回可与 R 对象一起使用的表达式 xtable。

    load 不返回这个。

    【讨论】:

    • 我认为这更进一步,他必须在调用shinyServer() 之前load。当我尝试在渲染函数或观察中加载它时,我永远无法将 load() 加载到正确的环境中。
    • 实际上,我刚刚尝试过,通过runAppDir 一切正常,其中load 在shinyServer 中被调用
    • 我可能搞砸了:gist.github.com/csgillespie/dfed8e3a8796d603ae2d 查看shinyServer 帮助页面,它似乎在最近版本的闪亮中发生了变化。
    • 啊,是的,我明白了。如果您使用的是响应式函数,那么由于作用域,内部加载会变得非常混乱。
    • 我使用了另一种方法,使用fileInput:stackoverflow.com/questions/30894780/…
    【解决方案2】:

    我通过“欺骗”R Shiny 解决了这个问题。我创建了一个 BOGUS textOutput,并在 renderText 中调用了一个外部函数,该函数基于所选的输入,将已经全局加载的环境设置为一个名为“e”的环境。请注意,您必须首先使用这种方法将所有 RDatas 手动加载到 global.R 中的环境中。假设您的数据不是那么大,或者您没有一百万个 RData,这似乎是一个合理的 hack。

    通过本质上创建如下所示的 loadEnvFn(),它返回作为 input$datasetNumber 传递的字符串输入,您可以避免将代码放入 reactive({}) 上下文时发生的范围问题。我试图做很多事情,但它们都需要反应式上下文。这样,我可以更改在 e 中加载的对象,而不必在我闪亮的服务器代码周围包装一个响应式 ({}) 范围。

    #Global Environment Pre-loaded before Shiny Server
    e = new.env()
    dataset1 = new.env()
    load("dataset1.RData", env=dataset1)
    dataset2 = new.env()
    load("dataset2.RData", env=dataset2)
    dataset3 = new.env()
    load("dataset3.RData", env=dataset3)
    
    
    ui = fluidPage(
      # Application title
      titlePanel(title="View Datasets"),
    
      sidebarLayout(
        # Sidebar panel
        sidebarPanel(width=3, radioButtons(inputId = "datasetNumber", label = "From which dataset do you want to display sample data?", choices = list("Dataset1", "Dataset2", "Dataset3"), selected = "Dataset2")
        ),
    
        # Main panel
        mainPanel(width = 9, 
          textOutput("dataset"), # Bogus textOutput
          textOutput("numInEnv")
        )
      )
    )
    
    loadEnvFn = function(input) {
      if (input$datasetNumber=="Dataset1") { 
        .GlobalEnv$e = dataset1
      } else if (input$datasetNumber=="Dataset2") { 
        .GlobalEnv$e = dataset2
      } else { 
        .GlobalEnv$e = dataset3
      }
      # Bogus return string unrelated to real purpose of function loadEnvFn
      return(input$datasetNumber) 
    }
    
    server = function(input, output, session) {
      output$dataset = renderText(sprintf("Dataset chosen was %s", loadEnvFn(input)))         # Bogus output
      output$numInEnv = renderText(sprintf("# objects in environment 'e': %d", length(ls(e))))
    }
    
    
    shinyApp(ui, server)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 2016-01-09
      • 2020-08-06
      • 1970-01-01
      • 2014-02-12
      • 2021-01-03
      • 2016-10-30
      相关资源
      最近更新 更多