如何在RShiny中执行长R脚本作为函数并在ui中显示解决方案?

时间:2017-01-17 17:34:59

标签: r rstudio shiny shiny-server

我正在尝试将R脚本作为R Shiny App运行。从ui,用户将上传.csv文件并输入4个数字变量。这些变量应该通过函数传递,它将生成一个final_table,它应该在Shiny App中显示为输出。目前,变量正在通过函数传递,但不会产生最终表。我是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)
    })
   })
  })

1 个答案:

答案 0 :(得分:1)

您的输出呈现对似乎不匹配。如果你想使用常规表,你应该:

# ui
tableOutput('contents2')

# server
output$contents2 <- renderTable({})

如果您想使用数据表,您应该:

# 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()
})