对于Shiny

时间:2017-09-08 13:55:10

标签: r loops vector shiny reactive

我在Shiny服务器中遇到了for循环的问题,直到现在还没有人能找到解决方法。我这几天一直在努力,但仍然没有取得任何进展。长话短说,请看下面的代码。我试图从Google财经获取数据并计算平滑的差异。

  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]
    }
  })

for循环根本不起作用。 错误代码是

错误:'closure'类型的对象不是子集

但我已经使用了()来处理函数内部的变量。所以我不知道如何解决这个问题。

BTW,我也试过以下代码

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

错误代码是

没有活动的反应上下文时,不允许操作。 (你试图做一些只能在反应式表达式或观察者内部完成的事情。)

我感谢能提供任何帮助的任何人。谢谢!

1 个答案:

答案 0 :(得分:5)

您对被动(stock.var.smoothed[1] <<-)的子集分配根本没有意义:即使没有子集,这个操作也不是您想要的(它会用非反应值替换您的被动对象) ;即它会停止反应)。

可以创建并分配给被动表达式中的变量。但是不要分配给全局环境(即不要使用<<-),也不要尝试重新分配被动对象本身。而是创建一个本地临时变量:

stock.var.smoothed <- reactive({
  value <- numeric(length(stock.var()))
  value[1] <- stock.var()[1]

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

  value
})

在这里,value可以是任何名称(包括stock.var.smoothed - 但这是一个不同的变量,而不是你的反应,因为它在不同的范围内)。

此外,我很确定这段代码是在没有循环和临时变量的情况下编写的(但是对于我来说它看起来并不是很明显)。

最后,关于代码样式的注释:不要在变量名称中使用.。这很令人困惑,因为它也用于S3分派以分离方法的通用名称和类名。 R中的一个常见约定是使用下划线(stock_var_smoothed)。