在Shiny中的无功函数中的for循环

Art*_*hur 1 loops r 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())))
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,我已经测试过了。

所以问题是下面的代码,我想基于一些计算来分配向量,但是我不知道正确的方法。

  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]
    }
  })
Run Code Online (Sandbox Code Playgroud)

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

错误:“关闭”类型的对象不可子集化

但是我已经在函数中使用了()作为变量。所以我不知道该如何解决。

顺便说一句,我也尝试了以下代码

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])
}
Run Code Online (Sandbox Code Playgroud)

错误代码是

没有活动的响应上下文,不允许进行操作。(您试图做只能从反应式表达式或观察器内部完成的操作。)

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

Kon*_*lph 6

您对反应式(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
})
Run Code Online (Sandbox Code Playgroud)

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

此外,我非常确定该代码没有循环和临时变量(但是对我来说看起来并不立即)。

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