从Shiny

时间:2016-02-14 14:32:18

标签: r shiny

我有一个小闪亮的程序,下面用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")
    )
  )
))

server.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)
  })
})

1 个答案:

答案 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中添加单选按钮,供用户选择文件类型。