2017-03-21 5 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, ...) 

これは可能ですか?


なぜなら、私はプログラム的に光沢のある入力を作成し、そのうちの1つがヒットしたときにプログラムでチェックしたいからです。

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

を、これも動作します:私は手動でui.R/UI機能で入力を宣言した場合、これは動作します

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

私はちょうどベクトル/リストとしてlist_of_inputsをobserveEvent与えることはできませんそれはそれを理解していないので、文字列/文字の。しかし、私はループを使用してリストを作成しようとした場合:

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

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() }) }) } } ) 
'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/とWinston Changに送られます。

複数のボタンがコールバックを共有する必要がある場合は、リストの外に関数を定義して、複数回ボタンを参照することができます。複数のコールバックが必要ない場合は、リストにコールバック要素を含めずに、代わりにobserveEventのイベント式を構築することができます。