如何在 RShiny 中执行长 R 脚本作为函数并在 ui 中显示解决方案?
How to execute a long R script as function in RShiny and display the solution in the ui?
我正在尝试 运行 将 R 脚本作为 R Shiny 应用程序。从 ui,用户将上传一个 .csv 文件并输入 4 个数字变量。这些变量应该通过函数传递,它会生成一个 final_table 应该在 Shiny App 中显示为输出。目前,变量正在通过函数传递,但不会产生最终的 table。我是 RShiny 的新手,感谢您帮助完成这项工作。
my_function.R 是包含函数 my_function() 的脚本文件。这实际上是一个 500 行的 R 脚本,压缩成一个函数以便于使用。
my_function <- function(tbl_load, ts_freq, ts_start_yr, ts_start_month, seasonal_cat) {
..........
return(collect_ALL_final_fair)
}
ui.R
library(shiny)
fluidPage(
titlePanel("Elasticity Tool"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose datatable csv file', accept=c('.csv')),
numericInput("ts_freq", "Time series frequency:", 52, min = 1, max = 100),
numericInput("ts_start_yr", "Starting year:", 2013, min = 1990, max = 2030),
numericInput("ts_start_month", "Starting month:", 3, min = 1, max = 12),
numericInput("seasonal_cat", "Seasonal Category", 0, min = 0, max = 1),
br(),
actionButton("goButton", label = "Run tool"),
br()
),
mainPanel(
tabsetPanel(type = 'tabs',
tabPanel("Output", tableOutput('contents2'))
)
)
)
)
server.R
library(shiny)
library(datasets)
source("my_function.R")
#packages
library("glmnet")
library(Matrix)
library(dplyr)
library(forecast)
library(zoo)
library(stats)
library(car)
options(scipen = 999)
shinyServer(function(input, output) {
observeEvent(input$goButton, {
tbl_load <- input$file1
ts_freq <- input$ts_freq
ts_start_yr <- input$ts_start_yr
ts_start_month <- input$ts_start_month
seasonal_cat <- input$seasonal_cat
output$contents2 <- renderDataTable({
my_function(tbl_load, ts_freq, ts_start_yr, ts_start_month, seasonal_cat)
})
})
})
您的 output-render 对似乎不匹配。如果你想使用常规 table,你应该有:
# ui
tableOutput('contents2')
# server
output$contents2 <- renderTable({})
如果你想使用数据table,你应该有:
# ui
DT::dataTableOutput('contents2')
# server
output$contents2 <- DT::renderDataTable({})
如果你想这样做,请确保你已经安装了 DT
包。
如果事实证明这不是唯一的问题,请将函数定义包含在 server.R
文件中(在加载适当的库之后)。如果这修复了它,那是因为您没有正确获取文件(也许您的路径不正确或类似的东西)。如果还是不行,那就是你函数本身的问题。
此外,您为什么不将输入直接传递给 my_function
?在这种情况下,您还应该避免使用观察者。相反,您可以使用 this pattern:
my_table <- eventReactive(input$goButton, {
my_function(input$file1, input$ts_freq, input$ts_start_yr,
input$ts_start_month, input$seasonal_cat)
})
output$contents2 <- renderTable({
my_table()
})
我正在尝试 运行 将 R 脚本作为 R Shiny 应用程序。从 ui,用户将上传一个 .csv 文件并输入 4 个数字变量。这些变量应该通过函数传递,它会生成一个 final_table 应该在 Shiny App 中显示为输出。目前,变量正在通过函数传递,但不会产生最终的 table。我是 RShiny 的新手,感谢您帮助完成这项工作。
my_function.R 是包含函数 my_function() 的脚本文件。这实际上是一个 500 行的 R 脚本,压缩成一个函数以便于使用。
my_function <- function(tbl_load, ts_freq, ts_start_yr, ts_start_month, seasonal_cat) {
..........
return(collect_ALL_final_fair)
}
ui.R
library(shiny)
fluidPage(
titlePanel("Elasticity Tool"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose datatable csv file', accept=c('.csv')),
numericInput("ts_freq", "Time series frequency:", 52, min = 1, max = 100),
numericInput("ts_start_yr", "Starting year:", 2013, min = 1990, max = 2030),
numericInput("ts_start_month", "Starting month:", 3, min = 1, max = 12),
numericInput("seasonal_cat", "Seasonal Category", 0, min = 0, max = 1),
br(),
actionButton("goButton", label = "Run tool"),
br()
),
mainPanel(
tabsetPanel(type = 'tabs',
tabPanel("Output", tableOutput('contents2'))
)
)
)
)
server.R
library(shiny)
library(datasets)
source("my_function.R")
#packages
library("glmnet")
library(Matrix)
library(dplyr)
library(forecast)
library(zoo)
library(stats)
library(car)
options(scipen = 999)
shinyServer(function(input, output) {
observeEvent(input$goButton, {
tbl_load <- input$file1
ts_freq <- input$ts_freq
ts_start_yr <- input$ts_start_yr
ts_start_month <- input$ts_start_month
seasonal_cat <- input$seasonal_cat
output$contents2 <- renderDataTable({
my_function(tbl_load, ts_freq, ts_start_yr, ts_start_month, seasonal_cat)
})
})
})
您的 output-render 对似乎不匹配。如果你想使用常规 table,你应该有:
# ui
tableOutput('contents2')
# server
output$contents2 <- renderTable({})
如果你想使用数据table,你应该有:
# ui
DT::dataTableOutput('contents2')
# server
output$contents2 <- DT::renderDataTable({})
如果你想这样做,请确保你已经安装了 DT
包。
如果事实证明这不是唯一的问题,请将函数定义包含在 server.R
文件中(在加载适当的库之后)。如果这修复了它,那是因为您没有正确获取文件(也许您的路径不正确或类似的东西)。如果还是不行,那就是你函数本身的问题。
此外,您为什么不将输入直接传递给 my_function
?在这种情况下,您还应该避免使用观察者。相反,您可以使用 this pattern:
my_table <- eventReactive(input$goButton, {
my_function(input$file1, input$ts_freq, input$ts_start_yr,
input$ts_start_month, input$seasonal_cat)
})
output$contents2 <- renderTable({
my_table()
})