我在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])
}
错误代码是
没有活动的反应上下文时,不允许操作。 (你试图做一些只能在反应式表达式或观察者内部完成的事情。)
我感谢能提供任何帮助的任何人。谢谢!
答案 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
)。