2017-03-21 140 views
0

TL; DR:R,串的矢量爲矢量輸入

我有個字符的這個矢量/列表時,它可以或者是這樣的:

list_of_inputs <- c('input$thing_1', 'input$thing_2', ...) 

或這樣的:

list_of_inputs <- c('thing_1', 'thing_2', ...) 

我需要的是將其轉換所以這樣解釋:

c(input$thing_1, input$thing_2, ...) 

這可能嗎?


原因是我想以編程方式做閃亮的輸入,並以編程方式檢查當他們其中之一已被擊中。如果我手動申報ui.R/UI功能輸入,這個工程:

observeEvent(c(input$manually_made_1, input$manually_made_2), { 
    print('a button has been hit!') 
} 

而且這也適用:

observeEvent(c(input[['manually_made_1']], input[['manually_made_2']]), { 
    print('a button has been hit!') 
} 

我不能只給observeEvent的list_of_inputs作爲載體/名單字符串/字符,因爲它不明白。但是,如果我嘗試使用一個循環做一個清單:

input_list <- c() 
for(i in 1:length(list_of_inputs){ 
    input_list <- append(input_list, input[[paste0('thing_',i)]]) 
} 

input_list結束了含有什麼,但NULL(或幾個)... 我嘗試使用as.symbol(),但似乎並沒有工作。有什麼建議麼?

+1

'sapply(列表( 'thing_1', 'thing_2',...),函數(x)的輸入[[X]])' – HubertL

+0

@HubertL完美在observeEvent工作過,感謝。似乎你不能把它分配給一個變量,但這並不重要。想要回答? – ZN13

回答

0

以下是您考慮的替代解決方案。下面的Shiny應用程序獲取按鈕信息列表(ID,標籤和回調),併爲每個項目添加actionButton和觀察者。每按一下按鈕將從列表中觸發相應的回叫功能。

致電local()是關鍵。如果刪除對local的調用,則僅將for循環的最終表達式註冊爲觀察者。信用爲local解決方法去這個線程https://gist.github.com/wch/5436415/和溫斯頓張。

如果多個按鈕需要共享回調,您可以在列表外部定義該功能並多次引用它。如果不需要多次回調,則可以放棄在列表中包含回調元素,並改爲創建observeEvent的事件表達式。

library(shiny) 

myButtons <- list(
    list(
    id = "first", 
    label = "First Button", 
    callback = function() { 
     print("The first button was pushed??") 
    } 
), 
    list(
    id = "second", 
    label = "Second Button", 
    callback = function() { 
     print("And now the second button was pushed") 
    } 
) 
) 

shinyApp(
    ui = fluidPage(
    lapply(
     myButtons, 
     function(btn) actionButton(btn$id, btn$label) 
    ) 
), 
    server = function(input, output, session) { 
    for (btn in myButtons) { 
     local({ 
     btnLocal <- btn 
     observeEvent(input[[btnLocal$id]], { 
      btnLocal$callback() 
     }) 
     }) 
    } 
    } 
)