2017-05-10 81 views
2

我有一個問題,插入一個閃亮的表中的值的向量。問題是它總是將矢量的最後一個條目保存到我嘗試操縱的所有單元格中。 例如:閃亮的輸出變量中的重複值

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

預先感謝您的幫助,

邁克爾

+0

檢查這個帖子:http://stackoverflow.com/questions/43762513/r-shiny-bad-dependency-from- for-loop-variable-is-there-a-way-to-force-evaluatio and this discussion:https://github.com/rstudio/shiny/issues/532 – BigDataScientist

+0

我會將它標記爲重複的,而不是我認爲的其他問題很難找到,你問的方式仍然帶來價值。 (請參閱此處https://meta.stackoverflow.com/a/292398/3502164) – BigDataScientist

+1

可能的重複[R對於循環變量發出不良依賴。有沒有辦法強制評估?](http://stackoverflow.com/questions/43762513/r-shiny-bad-dependency-from-for-loop-variable-is-there-a-way-to-force-評判的) – BigDataScientist

回答

1

這是一個有趣的問題,答案很複雜。基本上,你正在懶惰懶惰的評價,由此功能並沒有真正評價,但一個所謂的「承諾」被存儲,而不是評估。

瀏覽各種鏈接,你會看到各種解決方案,其中一些BigDataScientist指出(這是一個很大的幫助),一些是相關的,但也有一些是過時的。解決方法隨着時間的推移也發生了變化 - 僅僅聲明它是重複的就不能解決正義問題。

因此,下面是一個例子,它將您的代碼的較小版本擴展爲具有三種可能解決方案的實際示例。

  • 有4個可能的服務器功能,s0s1s2s3。您可以通過在最後一行(shinyApp(u,s0)調用)中更改該參數來切換它們。
  • s0是原始代碼。 s1,s2,s3是鏈接中建議的三種可能的解決方法(也有其他幾種,但這些是主要的)。
  • 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