R 输出变量中的重复值

R 输出变量中的重复值,r,shiny,lazy-evaluation,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",

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

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

outValues这是一个有趣的问题,答案是。。。复杂。基本上,您是在犯懒惰求值的错误,即函数没有真正求值,而是存储了一个所谓的“promise”,并进行求值

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

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

  • 有4种可能的服务器功能,
    s0
    s1
    s2
    s3
    。您可以通过更改最后一行中的参数(shinyApp(u,s0)
调用)在它们之间切换
  • s0
    是原始代码<代码>s1,
    s2
    s3
    是链接中建议的3种可能的解决方法(也有一些其他的,但这些是主要的)
  • s1
    s3
    现在可以工作了。我的理解是,
    s2
    (force)起作用,而
    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)
    
    库(闪亮)
    
    超越价值观查看这篇帖子:这篇讨论:我将把它标记为重复,不管怎样,我认为另一个问题很难找到,你的提问方式仍然带来价值。(请参见此处:)的可能副本