2017-05-03 24 views
2

一個簡單的方法來複制這個問題:R對於循環變量,閃亮的不良依賴項。有沒有辦法強制評估?

shinyApp(
    ui = fluidPage(
    textOutput("helloJohn"), 
    br(), 
    textOutput("helloJacob"), 
    br(), 
    textOutput("helloJoe")), 
    server = function(session, input, output) { 
    for(name in c("John", "Jacob", "Joe")) { 
     output[[paste0("hello", name)]] <- renderText({paste0("hello ", name, "!")}) 
    } 
    }) 

這段代碼的目的是使文本「Hello約翰」,「你好雅各布」,「你好喬」顯示在頁面上,而無需重複使用renderText大塊。然而,儘管它似乎是輸出名都設置正確,所呈現的時候似乎name被設置在for循環的最後一個值,從而導致所有的名稱爲「喬」:

All Joe!

我認爲這是由於Shiny設置依賴關係圖的方式,但name不是一個無功變量,它在初始化過程中可用。有沒有一種方法可以強制在for循環中對name進行評估,類似於Haskell中的Bang Patterns?

+0

在更新輸出之前試着'強制(名稱)'循環內部 – FlorianGD

回答

2

您可以將for循環中的內容封裝到local中,並創建一個接收name的本地變量name2

for(name in c("John", "Jacob", "Joe")) { 
    local({ 
    name2 <- name 
    output[[paste0("hello", name2)]] <- renderText({paste0("hello ", name2, "!")}) 
    }) 
} 

此答案的其他信息和靈感here

+0

閱讀提供的鏈接,我還發現使用'lapply()'也可以解決問題。 – BigDataScientist