以下Shiny服务器端代码可以正常运行
tsm <- reactive({
if (input$forecast == "fit_BC") {
fit_d <- ar(BoxCox(dtr, lambda=BoxCox.lambda(dtr)))
forecast(fit_d, h=12, lambda=BoxCox.lambda(dtr))
} else if (input$forecast == "fit_net") {
lambda <- BoxCox.lambda(dtr)
fit_d <- nnetar(dtr, lambda = lambda)
forecast(fit_d, h = 12, PI = TRUE)
}
})
但是,当我使用局部变量LAMBDA(在第一个“ if”块中)时,它不再存在:
tsm <- reactive({
if (input$forecast == "fit_BC") {
lambda <- BoxCox.lambda(dtr)
fit_d <- ar(BoxCox(dtr, lambda=lambda))
forecast(fit_d, h=12, lambda=lambda)
} else if (input$forecast == "fit_net") {
lambda <- BoxCox.lambda(dtr)
fit_d <- nnetar(dtr, lambda = lambda)
forecast(fit_d, h = 12, PI = TRUE)
}
})
请注意,第二个“ if”块中的第二个LAMBDA不会使R烦恼。很显然,问题与“局部变量” LAMBDA有关。但我不明白为什么?
...我在下面提供了完整的代码;还可以在
共享数据library(shiny)
library(shinydashboard)
library(ggplot2)
library(forecast)
library(plotly)
library(ggfortify)
library(tseries)
data_master <- read.csv("data.csv")
d <- ts(data_master$demand, start = c(1995, 1), frequency = 12)
dtr <- ts(data_master$demand, start=c(1995, 1), end=c(2014, 12), freq=12)
shinyUI(dashboardPage(
dashboardHeader(title = "",
titleWidth = 450),
dashboardSidebar(disable = TRUE),
dashboardBody(
fluidRow(
column(width = 8,
box(plotlyOutput("forecast_plots"),
width = NULL)
)))))
shinyServer(function(input, output, session) {
tsm <- reactive({
# No "error" here
# fit_d <- ar(BoxCox(dtr, lambda=BoxCox.lambda(dtr)))
# forecast(fit_d, h=12, lambda=BoxCox.lambda(dtr))
# but this is generating error
lambda <- BoxCox.lambda(dtr)
fit_d <- ar(BoxCox(dtr, lambda=lambda))
forecast(fit_d, h=12, lambda=lambda)
})
output$forecast_plots <- renderPlotly({
df <- data.frame(time=c(1995,2015,1/12), x=c(tsm()$x, tsm()$mean))
ggplot(df, aes(time, x))+geom_line(colour = "black")
})
})