我使用Shiny作为查看本地存储在一系列.RData
文件中的表的接口,但是我无法让表格呈现。
我的server
代码是这样的:
output$table1 <- renderTable({
load(paste0(input$one,"/",input$two,".RData"))
myData})
在ui
方面,我只是在主面板中显示表格。
This other SO question表明问题在于加载数据的环境消失,因此数据无法显示。他们建议创建一个global
文件并在其中加载.RData
文件,但我不相信我能够以这种方式动态加载数据。有关如何在.RData
内有效使用shiny
文件的任何指导将不胜感激。
此致
答案 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)