从数据库访问.Rdata中的数据帧
我有一个小的Shining程序,下面使用Shining读取.Rdata文件。下面的代码按预期工作,但有一种行为是我想要的,我无法完全弄清楚如何从内部实现 为了解决第一个问题,假设我有一个名为tmp.Rdata的文件,当该.Rdata加载到R工作区时,它包含一个名为“foo”的数据帧。我的目标是使用shiny加载.Rdata,然后访问其中的数据帧(foo)并对其执行R操作 例如,如果我在R范围内工作,我的行为将类似于:从数据库访问.Rdata中的数据帧,r,shiny,R,Shiny,我有一个小的Shining程序,下面使用Shining读取.Rdata文件。下面的代码按预期工作,但有一种行为是我想要的,我无法完全弄清楚如何从内部实现 为了解决第一个问题,假设我有一个名为tmp.Rdata的文件,当该.Rdata加载到R工作区时,它包含一个名为“foo”的数据帧。我的目标是使用shiny加载.Rdata,然后访问其中的数据帧(foo)并对其执行R操作 例如,如果我在R范围内工作,我的行为将类似于: > load('tmp.Rdata') > str(foo) 假
> load('tmp.Rdata')
> str(foo)
假设foo是一个包含K列的数据帧,str(foo)的结果将显示str()在对象上的典型行为
当实现下面的代码时,闪亮的程序运行,我可以看到.Rdata成功加载,并且“foo”在工作区中。但是,这个实例中str()的结果操作是显示对象foo在工作区中,而不是对象foo本身的结构,这是我想要实现的行为
chr "foo"
现在,如果我提前知道.Rdata中始终包含一个名为“foo”的框架,我可以将其硬编码到server.R代码中,一切都很好。但是,更具挑战性的问题是,我的用户将保存一个.Rdata文件,其中包含一个名称未知的数据帧
我搜索了这么多,发现了类似的问题,但就我所知,并没有完全解决相同的问题,比如下面链接中的问题
谢谢你的建议
用户界面
服务器.R
shinyServer(功能(输入、输出){
dataInput您可以使用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)
})
})
shinyServer(功能(输入、输出){
dataInput您可以使用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)
})
})
shinyServer(功能(输入、输出){
dataInput尝试使用从字符串文本检索对象(因为dataInput()可能返回字符值):str(get(ff))
。如果试图在.RData
中查找数据帧的名称,则可以比较加载前后的ls()
输出(假设数据中只有一个数据帧)您可以改进@NicE的建议,创建一个环境,将R数据文件加载到该环境中。然后使用ls
获取环境的内容。然后您可以使用get
从环境中检索数据帧。非常有帮助,谢谢。如果您有喜欢的解决方案,我会感兴趣的看看你是如何实现它的。听听你对这种方法有多满意。这对我来说可能会很有用。试着使用从字符串文本中检索对象(因为dataInput()可能返回一个字符值):str(get(ff))
。如果您试图在.RData
中查找数据帧的名称,则可以比较加载前后ls()
的输出(假设数据中只有一个数据帧)您可以改进@NicE的建议,创建一个环境,将R数据文件加载到该环境中。然后使用ls
获取环境的内容。然后您可以使用get
从环境中检索数据帧。非常有帮助,谢谢。如果您有喜欢的解决方案,我会感兴趣的看看你是如何实现它的,听到你对这个方法有多满意,这可能会对我有帮助。
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)
})
})