从数据库访问.Rdata中的数据帧

从数据库访问.Rdata中的数据帧,r,shiny,R,Shiny,我有一个小的Shining程序,下面使用Shining读取.Rdata文件。下面的代码按预期工作,但有一种行为是我想要的,我无法完全弄清楚如何从内部实现 为了解决第一个问题,假设我有一个名为tmp.Rdata的文件,当该.Rdata加载到R工作区时,它包含一个名为“foo”的数据帧。我的目标是使用shiny加载.Rdata,然后访问其中的数据帧(foo)并对其执行R操作 例如,如果我在R范围内工作,我的行为将类似于: > load('tmp.Rdata') > str(foo) 假

我有一个小的Shining程序,下面使用Shining读取.Rdata文件。下面的代码按预期工作,但有一种行为是我想要的,我无法完全弄清楚如何从内部实现

为了解决第一个问题,假设我有一个名为tmp.Rdata的文件,当该.Rdata加载到R工作区时,它包含一个名为“foo”的数据帧。我的目标是使用shiny加载.Rdata,然后访问其中的数据帧(foo)并对其执行R操作

例如,如果我在R范围内工作,我的行为将类似于:

> 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)

  })
})