有自己功能的闪亮app

时间:2016-11-21 09:20:40

标签: r shiny shinydashboard reactive

我想在Shiny应用中实现一项功能。我自己的函数get_calculate()将参数data和tolerance作为输入,并使用listdata.frame重新构造plot

我想根据容差显示输出。在我的服务器功能中,我使用reactive()来运行get_calculate()但它不起作用。

如果我写renderPlot()renderDataTable() get_calculate()有效。 但是,对于大型数据集,效率很低,因为Shiny必须运行get_calculate()两次。

library(shiny)
library(shinydashboard)
library(foreign)
#load my own function
source("01-get_calculate.R")


ui <- dashboardPage(

  dashboardHeader(title = "Analysis"),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Load data", tabName = "data", icon = icon("database")),
      menuItem("Mainboard", tabName = "Mainboard", icon = icon("dashboard"))
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "data",
              fileInput("datafile", "Choose file",
                        accept = c("text/csv/rds/dbf", 'text/comma-separated-values,text/plain')),

              dataTableOutput("mytable")

      ),
      tabItem(tabName = "Mainboard",
              fluidRow(
                box(
                  title = "Input", status = "primary", solidHeader = TRUE, collapsible = TRUE,
                  sliderInput(inputId = "tol",
                              label = "Tolerance",
                              value = 4, min = 1, max = 15, step = 1)
                )),
              fluidRow(
                box(
                  title = "Adherence Curve", status = "warning", solidHeader = TRUE, collapsible = TRUE,
                  plotOutput("plot_kpm")
                ),

                box(
                  title = "Overview Table", status = "primary", solidHeader = TRUE, collapsible = TRUE,
                  tableOutput("table_kpm")
              )
      )
    )
  )
)
)



server <- function(input, output) {


  filedata <- reactive({
    infile <- input$datafile
    if (is.null(infile)) {
      return(NULL)
    }
    read.dbf(infile$datapath)
  })



  output$mytable <- renderDataTable({
    filedata()
  })

  **test <- reactive({
    get_calculate(filedata(), tolerance = input$tol)
  })

  output$plot_kpm <- renderPlot({ 
    test$kpm_chart
  })

  output$table_kpm <- renderDataTable({
    test$data_kpm[, c("Time", "numbers", "Percent")]
  })**


}

shinyApp(ui = ui, server = server)

3 个答案:

答案 0 :(得分:0)

您提到的错误很可能来自renderDataTable,您尝试从test $ data_kpm中选择几列。检查数据框中的确切列名称。

答案 1 :(得分:0)

此版本的闪亮应用程序运行。但它&#39;低效,因为闪亮必须运行get_calculate两次。

f

答案 2 :(得分:0)

为什么不使用反应式表达式只运行一次get_calculate?然后在输出$ plot_kpm中使用结果并输出$ table_kpm? 这将优化您的代码。