【发布时间】:2016-05-25 09:24:50
【问题描述】:
我在下面有一个闪亮的小程序,它使用 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
感谢您的任何建议。
ui.R
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")
)
)
))
服务器.R
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)
})
})
【问题讨论】:
-
尝试使用get() 从字符串文字中检索对象(因为 dataInput() 可能返回一个字符值):
str(get(ff))。 -
如果您试图在
.RData中查找数据框的名称,您可以比较加载前后ls()的输出(假设数据中只有一个数据框) -
您可以通过创建环境来改进@NicE 的建议,将 R DATA 文件加载到该环境中。然后使用
ls获取环境的内容。然后您可以使用get从环境中检索数据框。 -
非常有帮助,谢谢。
-
当您有自己喜欢的解决方案时,我很想看看您是如何实现它的。并听到您对这种方法的满意程度。以后可能对我有用。