如何在闪亮的服务器中使用for循环?

时间:2017-09-07 19:27:04

标签: r loops shiny reactive

这是我在这里的第一个问题,有人可以帮我解决这个问题吗?我真的很感激!

我正在尝试基于现有向量创建向量。但闪亮服务器内的for循环并不适合我。我尝试了很多方法,但仍然做不到。

ui <- (
tabPanel(
    "Momentum Analysis",
    sidebarPanel(
      width = 4,
      textInput("ticker2", "Stock ticker:"),
      dateRangeInput(
        "date2",
        "Date Range:",
        max = Sys.Date(),
        end = Sys.Date(),
        startview = "year"
      ),
      numericInput(
        "alpha",
        "Volatility smoothing parameter:",
        min = 0,
        max = 1,
        value = 0.05
      ),
      numericInput(
        "beta",
        "Momentum smoothing parameter:",
        min = 0,
        max = 1,
        value = 0.05
      ),
      radioButtons("type2",
                   "Chart Type:",
                   c(
                     "Momentum vs. Volatility" = "mvv",
                     "Signal to Noise Ratio" = "snr"
                   )),
      actionButton(
        "plot2",
        "Plot",
        icon("line-chart"),
        style = "color: #fff;
        background-color: #337ab7;
        border-color: #2e6da4"
      ),
      div(
        style = "display: inline-block;
        vertical-align: top",
        downloadButton("download2", "Download historical stock price data")
      )
    ),
    mainPanel(plotOutput("chart2"))
    )
  )
)

server <- function(input, output){
    stock2 <-
    reactive(
      getSymbols(
        toupper(input$ticker2),
        from = as.Date(input$date2[1]) - 150,
        to = input$date2[2],
        src = "google",
        auto.assign = F
      )
    )

  stock3 <- reactive(as.data.table(stock2()))
  stock <- reactive(as.data.frame(stock3()))
  stock.return <- reactive(diff(log(stock()[, 5])))
  stock.mu <- reactive(mean(stock.return()))
  stock.var <- reactive((stock.return() - stock.mu()) ^ 2)
  stock.var.smoothed <- reactive(rep(0, length(stock.return())))

  stock.var.smoothed <- reactive({
    for (i in 2:length(stock.var())) {
      stock.var.smoothed[1] <- stock.var()[1]
      stock.var.smoothed[i] <-
        (1 - input$alpha) * stock.var.smoothed()[i - 1] + input$alpha * stock.var()[i]
    }
  })

  stock.std.smoothed <- reactive(sqrt(stock.var.smoothed()))
  stock.std.smoothed.annually <- reactive(stock.var.smoothed() * sqrt(252))

  stock.momentum <- reactive(stock.return())
  stock.momentum.smoothed <- reactive(rep(0, length(stock.return())))

  stock.momentum.smoothed <- reactive({
    for (i in 2:length(stock.return())) {
      stock.momentum.smoothed[1] <- stock.momentum()[1]
      stock.momentum.smoothed[i] <-
        (1 - input$beta) * stock.momentum.smoothed()[i - 1] + input$beta * stock.return()[i]
    }
  })

  stock.momentum.smoothed.annually <-
    reactive(stock.momentum.smoothed() * 252 / 100)

  stock.SNR <-
    reactive(stock.momentum.smoothed.annually() / stock.std.smoothed.annually())

  output$chart2 <- renderPlot({
    req(input$plot2)
    if (input$type2 == "mvv"){
      plot(
        stock.momentum.smoothed(),
        main = "Momentum v.s. Volatility",
        col = "red",
        type = "l",
        xaxt = "n",
        ylab = "Momentum v.s. Volatility",
        xlab = "Date",
        ylim = c(-2, 2)
      )
      lines(stock.std.smoothed())
      axis(1, at = 1:length(stock()[, 1]), labels = stock()[, 1])
    }
    else if (input$type2 == "snr"){
      plot(
        stock.SNR(),
        main = "Signal to Noise",
        type = "l",
        col = "red",
        ylim = c(-1, 1),
        xaxt = "n",
        ylab = "Signal to Noise Ratio",
        xlab = "Date"
      )
      abline(h = 0.5)
      axis(1, at = 1:length(stock()[, 1]), labels = stock()[, 1])
    }
  })

  output$download2 <- downloadHandler(
    filename = function() {
      paste(toupper(input$ticker2),
            " ",
            input$date2[1],
            " ",
            input$date2[2],
            ".xlsx",
            sep = "")
    },
    content = function(file) {
      write.xlsx2(stock2()[paste0(input$date2, "/"),], file)
    }
  )

}

我试图描绘股票的动量与波动性,两者都是平滑的。我的应用程序有一些其他选项卡,但它们无关紧要,所以我只是隐藏了代码。 这里唯一的问题是循环和反应功能。谢谢!

1 个答案:

答案 0 :(得分:0)

请参阅Konrad Rudolph的回答

For loop inside reactive function in Shiny

我试图分配一个带有函数(reactive)的向量。但是我没有给任何函数返回,所以我不能调用这个函数。