闪亮:动态加载.RData文件

时间:2016-02-05 23:45:36

标签: r shiny

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

我的server代码是这样的:

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

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

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

此致

2 个答案:

答案 0 :(得分:1)

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

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

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

  

expr:一个表达式,它返回一个可以与之一起使用的R对象   xtable。

load不会返回此内容。

答案 1 :(得分:0)

我绕过这个&#34;欺骗&#34; R Shiny。我创建一个BOGUS textOutput,并在renderText中调用一个外部函数,该函数基于所选的输入,将已经全局加载的环境设置为一个名为&#34; e&#34;的单个环境。注意,您必须首先使用此方法手动将所有RDatas加载到global.R中的环境中。假设你的数据不大,或者你没有数百万的RDatas,这似乎是一个合理的黑客攻击。

通过实质上创建一个loadEnvFn(),如下所示,返回作为输入$ datasetNumber传递的字符串输入,可以避免在将代码置于被动({})上下文时出现的范围问题。我试图做一些事情,但他们都需要反应性的背景。通过这种方式,我可以更改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)