我想在Shiny
应用中实现一项功能。我自己的函数get_calculate()
将参数data和tolerance作为输入,并使用list
和data.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)
答案 0 :(得分:0)
您提到的错误很可能来自renderDataTable,您尝试从test $ data_kpm中选择几列。检查数据框中的确切列名称。
答案 1 :(得分:0)
此版本的闪亮应用程序运行。但它&#39;低效,因为闪亮必须运行get_calculate两次。
f
答案 2 :(得分:0)
为什么不使用反应式表达式只运行一次get_calculate?然后在输出$ plot_kpm中使用结果并输出$ table_kpm? 这将优化您的代码。