【问题标题】:Error when using a for loop in R shiny dashboard在 R 闪亮的仪表板中使用 for 循环时出错
【发布时间】:2020-07-14 17:31:26
【问题描述】:

我正在尝试根据之前创建的 R 代码创建一个闪亮的。

我面临的问题是 for 循环不起作用。

一个例子是:

    
    centros.acp=reactive({colMeans(a.acp())})
    
    lcov.acp=reactive({solve(cov(a.acp()))})
    
    dm.acp=reactive({rep(0,length(a.acp()[,1]))})
    
    na.acp=reactive({a.acp()[1]})
    
    dm.acp()=reactive({
      value=dm.acp()
      for(i in na.acp()){

      value()[i]<-reactive({round(t(a.acp()[i,]-centros.acp())%*%lcov.acp()%*%(a.acp()[i,]-centros.acp()),3)

    })}})
    T2<-reactive({dm.acp()})
    my_list=reactive({list("T2" = T2(),"cc.sw.UCL.99" = cc.sw.UCL.99(),"cc.sw.UCL.95" = cc.sw.UCL.95(), "num.com"=num.com())})
   
   output$plot_t2=renderPlot({plot(1:n(),my_list()$T2, ylim = c(0,max(my_list()$T2,my_list()$cc.sw.UCL.99)+3),main = "",
         xlab = 'OBS',ylab = 'T2') })

我得到了错误

Error in dm.acp() = reactive({ : invalid (NULL) left side of assignment

我展示的代码是解决问题的唯一部分,其他一切正常。 我尝试了不同的方法,但总是得到错误,或者绘制的图形是基于包含在 0 组中的原始 dm.acp()。当我运行 for 循环时,我想用值替换 0(在每次迭代中新号码已更改)。

原来的dm.acp()是

> dm.acp
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[50] 0 0 0 0 0 0 0 0 0 0 0

在for循环之后应该是

[1]  6.210  3.663  4.246  4.279  3.766  3.583  2.957  4.796  4.578  3.225  4.232  2.865  6.976  3.454
[15]  3.411  3.530  3.610 22.747  9.936  2.659  3.080  6.412  9.183  2.781  3.253  5.585  3.183  5.171
[29]  3.898  5.868  2.498 12.901  2.772  2.795  1.644  1.393 21.078  2.489  3.198  2.412  4.213  4.251
[43]  8.144  3.201  3.295  4.378  4.746  9.481  4.281  4.402  5.329  2.637  2.627  4.507  5.521  3.545
[57]  2.623  5.835  2.438  3.230

感谢您的帮助。谢谢!

【问题讨论】:

  • 如果您包含一个最小的 reproducible example 以及可用于测试和验证可能的解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • @MrFlick 我在输出中添加了数据,谢谢!

标签: r for-loop shiny shinydashboard


【解决方案1】:

尝试用lapply 替换您的for 循环,如下所示:

lapply(1:na.acp(), function(i){
  value()[i]<-reactive({
    round(t(a.acp()[i,]-centros.acp())%*%lcov.acp()%*%(a.acp()[i,]-centros.acp()),3)
  })
})

更新:请试试这个代码。

dm.acp<-c(rep(0,60))
    
    n <- length(dm.acp)
    lapply(1:n, function(i) { 
      dm.acp[i] <<- i+2
    })

您应该能够在您的程序中实现这一点。如果您要使用lapply 中的函数,请将其附上lapply(1:(length(na.acp)),function(i){…})

Update2:请看下面的代码

###  replace this code  ###
dm.acp=reactive({rep(0,length(a.acp()[,1]))})

na.acp=reactive({a.acp()[1]})

dm.acp()=reactive({
  value=dm.acp()
  for(i in na.acp()){
    
    value()[i]<-reactive({round(t(a.acp()[i,]-centros.acp())%*%lcov.acp()%*%(a.acp()[i,]-centros.acp()),3)
      
    })}})
T2<-reactive({dm.acp()})


###  with this code   ###
dm.acpv=reactive({rep(0,length(a.acp()[,1]))})

na.acp=reactive({a.acp()[1]})

T2 <- reactive({
  value=dm.acpv()
  
  lapply(1:(na.acp()), function(i){
    value[i] <<- round(t(a.acp()[i,]-centros.acp())%*%lcov.acp()%*%(a.acp()[i,]-centros.acp()),3)
  })
  value
})
## no need to define T2 again as I renamed dm.acp as T2

【讨论】:

  • 感谢您的帮助。它最初给了我这个错误`在没有活动反应上下文的情况下不允许操作。 (你试图做一些只能从反应式表达式或观察者内部完成的事情。)`所以我把函数放在反应式中,并更改了`T2
  • 正如@MrFlick 所说,最好发布一个reprex。但是,查看您的代码dm.acp()=reactive({value=dm.acp(),...}),您似乎正在访问您正在定义的内容。请将其更改为dm.acpp&lt;-reactive({value=dm.acp(),...}),并在此阶段后使用 dm.acpp。那应该行得通。当你定义一个反应式时,你不需要括号 (),你不能在其中调用自己 - 只需给它一个不同的名称。
  • 感谢您的帮助。现在它给了我错误invalid (NULL) left side of assignment 显示整个数据非常复杂,因为您可以看到有很多变量。一个简单的测试方法是在正常的 R 代码中执行 dm.acp&lt;-c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 然后执行 for(i in 1:length(dm.acp)){ dm.acp[i]=i }。我无法向您展示如何在响应式中进行操作,因为它给了我错误。
  • 如何以反应方式应用更新后的代码,即原始代码?非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多