使用加载的文件作为输入以在闪亮

时间:2018-05-25 08:33:14

标签: r shiny

我正在开发一个闪亮的网络应用程序,旨在:

  • 加载文件
  • 使用函数myDummyFun
  • 解析文件一次
  • 使用返回的数据框d作为输入,以跨多个标签绘制函数

这是我正在做的简化版本,它说明了问题(尽管使用mtcars数据集代替加载的文件:

library(shiny)
library(dplyr)
data(mtcars)

ui <- fluidPage(

  tabsetPanel(
    # Tab 1
    tabPanel("Upload File",
             titlePanel("Upload your file"),
              sidebarLayout(
               sidebarPanel(
                 fileInput('file1', 'Browse for your file')
               ),
               mainPanel(
                 renderDataTable('contents')
               )
              )

    ),

    tabPanel("Plot",
             pageWithSidebar(
               headerPanel('Example plot'),
               sidebarPanel(),
               mainPanel(
                 plotOutput('plotExample')
               )
             )
    )
  )
)
myDummyFun <- function(x){
  x <- x %>% 
    filter(disp<=400) 

  return(x)
}
server <- function(input, output, server) {

  observe({

    inFile <- input$file1

    if (is.null(inFile))
      return(NULL)

    # I am really using the loaded file as input: 
    # d <- myDummyFun(inFile$datapath)
    d <- myDummyFun(mtcars)

  })

  # datatable of data
  output$contents <- DT::renderDataTable({
    renderDataTable(d)
  })

  # tabPanel 1 
  output$plotExample <-renderPlot({
    ggplot(d) +
      geom_point(aes(disp, mpg))

  })
}
shinyApp(ui = ui, server = server)

我的解析函数myDummyFun实际上非常大,需要一段时间才能读取所选文件input$file1,所以我想读取一次文件,然后返回数据每个绘图功能可访问的框架

在此示例中, d是本地范围的,因此renderDataTable(d)renderPlot 无法访问。组织这个的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

帮助观察?observe说:

  

观察者就像一个反应性表达,因为它可以读取被动反应   值和调用反应式表达式,并将自动   当这些依赖关系发生变化时重新执行。但不像反应   表达式,它不会产生结果,也不能用作输入   其他反应性表达。因此,观察者只对其有用   它们的副作用(例如,执行I / O)。

答案here假设将output$something调用嵌套在observe结构中。

因此,我认为您的observe应该是这样的:

  observe({
    inFile <- input$file1

    if (is.null(inFile))
      return(NULL)

    # I am really using the loaded file as input: 
    # d <- myDummyFun(inFile$datapath)
    d <- myDummyFun(mtcars)
    output$contents <- DT::renderDataTable({
      renderDataTable(d)
    })

    # tabPanel 1 
    output$plotExample <-renderPlot({
      ggplot(d) +
        geom_point(aes(disp, mpg))

    })
  })

在评论if (is.null(inFile)) return(NULL)部分时,此应用也会运行,情节看起来像

enter image description here

完整性,完整代码:

ui.R

library(shiny)
library(dplyr)
library(ggplot2)
data(mtcars)

fluidPage(

  tabsetPanel(
    # Tab 1
    tabPanel("Upload File",
             titlePanel("Upload your file"),
             sidebarLayout(
               sidebarPanel(
                 fileInput('file1', 'Browse for your file')
               ),
               mainPanel(
                 renderDataTable('contents')
               )
             )

    ),

    tabPanel("Plot",
             pageWithSidebar(
               headerPanel('Example plot'),
               sidebarPanel(),
               mainPanel(
                 plotOutput('plotExample')
               )
             )
    )
  )
)

server.R

myDummyFun <- function(x){
  x <- x %>% 
    filter(disp<=400) 

  return(x)
}

function(input, output, server) {

  observe({
    inFile <- input$file1

    # if (is.null(inFile))
    #   return(NULL)
    # 
    # I am really using the loaded file as input: 
    # d <- myDummyFun(inFile$datapath)
    d <- myDummyFun(mtcars)
    output$contents <- DT::renderDataTable({
      renderDataTable(d)
    })

    # tabPanel 1 
    output$plotExample <-renderPlot({
      ggplot(d) +
        geom_point(aes(disp, mpg))

    })
  })

  # datatable of data

}

希望这有帮助。