闪亮输出变量中的重复值

时间:2017-05-10 10:51:21

标签: r shiny lazy-evaluation

我在将值向量插入到闪亮的表中时遇到问题。问题是它总是将向量的最后一个条目保存到我试图操作的所有单元格中。 例如:

outValues <- c(368,331,334,443,348,324,608,376,354,706)
stations <- c("Station_Electric_Testing_PLx","Station_Wall_Polishing",
              "Station_Dicing_Grooving","Station_Coating",
              "Station_Electric_Testing_PL","Station_PhotoLitho",
              "Station_Face_Polishing","Station_Anealling",
              "Station_CleaningAfter_45","Station_45_Cutting", 
              "Station_Kupelevitz")

         for(stat in stations){
           i <- i+1
           output[[paste0("Out_",stat)]] <- renderText({paste0(outValues[i])})
         }

在此代码之后,我表中的所有值都是706。

先谢谢你的帮助,

迈克尔

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,答案很复杂。基本上你是懒惰的评估,因为函数没有真正评估,但所谓的“承诺”被存储而不是评估。

浏览各种链接,你会看到各种解决方案,其中一些是BigDataScientist指出的(这是一个很大的帮助),有些是相关的,但也有一些已经过时了。随着时间的推移,变通方法也发生了变化 - 简单地宣称它是重复的,并不能解决问题。

所以这是一个示例,它将您的代码的较小版本扩展为具有三种可能解决方案的工作示例。

  • 有4种可能的服务器功能,s0s1s2s3。您可以通过更改最后一行(shinyApp(u,s0)调用)
  • 中的该参数来切换它们
  • s0是原始代码。 s1s2s3是链接中建议的3种可能的解决方法(还有其他几种,但这些是主要的)。
  • s1s3现在正常运作。我的理解是,s2(强制)有效,s3直到R版本3.2.0 - 但我没有3.2.0可以查看。
  • 从版本3.2.0开始,进行了一项更改,导致s2停止工作并s3开始工作。
  • 我不清楚为什么他们禁用force,似乎这是有用的功能。
  • 这也意味着参考过去的链接可能有点无意义,你必须尝试一下,并且在将来改变时不要感到惊讶。

    library(shiny)
    outValues <- c(368,331,334,443)
    stations <- c("Station_Electric_Testing_PLx","Station_Wall_Polishing",
                   "Station_Dicing_Grooving","Station_Coating")
    u <- fluidPage(
      verbatimTextOutput("Out_Station_Electric_Testing_PLx"),
      verbatimTextOutput("Out_Station_Wall_Polishing"),
      verbatimTextOutput("Out_Station_Dicing_Grooving"),
      verbatimTextOutput("Out_Station_Coating")
    )
    s0 <- function(input,output,session){
      i <- 0
      for(stat in stations){
        i <- i+1
        output[[paste0("Out_",stat)]] <- renderText({outValues[i]})
      }
    }
    s1 <- function(input,output,session){
      i <- 0
      for(stat in stations){
        i <- i+1
        local({
          txt <- outValues[i]
          output[[paste0("Out_",stat)]] <- renderText({txt})
        })
      }
    }
    s2 <- function(input,output,session){
      i <- 0
      for(stat in stations){
        i <- i+1
        f <- function(i) { force(i); outValues[i] }
        output[[paste0("Out_",stat)]] <- renderText({f(i)})
      }
    }
    s3 <- function(input,output,session){
          lapply(1:4,function(i){
                output[[paste0("Out_",stations[i])]] <- renderText({outValues[i]}) })
    }
    shinyApp(u,s3)
    

因此s0(原始)和s2(强制)会产生此输出 - 所需的内容:

enter image description here

s1(本地)和s3(lapply)将获得此输出,这是您想要的:

enter image description here

由于这是版本相关的,这是我的会话信息: enter image description here