我有一个小闪亮的程序,下面用Shiny读取.Rdata文件。下面的代码按预期工作,但有一些行为,我希望我无法弄清楚如何在Shiny中实现。
要构建第一个问题,假设我有一个名为tmp.Rdata的文件,当该.Rdata加载到R工作区时,它包含一个名为“foo”的数据框。我的目标是使用闪亮加载.Rdata,然后访问其中的数据框(foo)并对其执行R操作。
例如,如果我在R中工作,我的行为将是:
> load('tmp.Rdata')
> str(foo)
假设foo是一个包含K列的数据框,str(foo)的结果将显示str()在对象上的典型行为。
当实现下面的代码时,Shiny程序运行,我可以看到.Rdata成功加载并且“foo”在工作区中。但是,此实例中str()的结果操作是显示对象foo在工作空间中,而不是对象foo本身的结构,这是我想要实现的行为。
chr "foo"
现在,如果我提前知道.Rdata将始终在其中有一个名为“foo”的框架,我可以将其硬编码到server.R代码中,一切都很好。但是,更具挑战性的问题是我的用户将保存一个.Rdata文件,其中包含一个名称未知的数据框。
我搜索了SO并发现了类似的问题,但据我所知,并没有完全解决同样的问题,例如下面链接中的问题
Loading User input .Rdata on Shiny App
感谢您提出任何建议。
shinyUI(fluidPage(
titlePanel("Uploading Files"),
sidebarLayout(
sidebarPanel(
h4("Uploading Files"),
fileInput('f1', 'Choose RData File', accept=c('.RData, .Rds'))
),
mainPanel(
h4("Data Structure"),
verbatimTextOutput("datastr")
)
)
))
shinyServer(function(input, output) {
dataInput <- reactive({
sessionEnvir <- sys.frame()
if (!is.null(input$f1)) load(input$f1$datapath, sessionEnvir)
})
output$datastr <- renderPrint({
ff <- dataInput()
if (is.null(dataInput())) return() else str(ff)
})
})
答案 0 :(得分:1)
您可以使用eval()和parse()。下面更新的server.R代码显示了如何:
shinyServer(function(input, output) {
dataInput <- reactive({
sessionEnvir <- sys.frame()
if (!is.null(input$f1)) eval(parse(text = load(input$f1$datapath, sessionEnvir)))
})
output$datastr <- renderPrint({
ff <- dataInput()
if (is.null(dataInput())) return() else str(ff)
})
})
这仅适用于RData文件。你的ui.R似乎也表现出接受Rds文件的愿望。您需要使用readRDS加载它们。好消息是readRDS在没有eval()和parse()的情况下工作得很好。也许你可以在UI中添加单选按钮,供用户选择文件类型。