私は、私が解決策を見つけることができなかった非常に単純なユーザケースであると思っている:私はShinyがユーザ指定の入力数を生成し、それぞれを観察する。動的な入力数のためのオブザーバを生成する
以下の最小限の再現可能なコードでは、ユーザはtextInput
ウィジェットに入力することによって、必要なアクションボタンの数を示します。彼または彼女はその後、アクションボタンを生成する "submit"を押します。次に、ユーザは、(単にボタンの名前を印刷し、最小限のケース用など)を任意のアクションボタンをクリックすると、それに特定の出力を生成できるようにするために私が欲しいもの
は次のとおりです。
library("shiny")
ui <- fluidPage(textInput("numButtons", "Number of buttons to generate"),
actionButton("go", "Submit"), uiOutput("ui"))
server <- function(input, output) {
makeObservers <- reactive({
lapply(1:(as.numeric(input$numButtons)), function (x) {
observeEvent(input[[paste0("add_", x)]], {
print(paste0("add_", x))
})
})
})
observeEvent(input$go, {
output$ui <- renderUI({
num <- as.numeric(isolate(input$numButtons))
rows <- lapply(1:num, function (x) {
actionButton(inputId = paste0("add_", x),
label = paste0("add_", x))
})
do.call(fluidRow, rows)
})
makeObservers()
})
}
shinyApp(ui, server)
上記のコードの問題は、何人かのオブザーバが何らかの形で作成されていることですが、すべてが入力として、リスト内の最後の項目だけがlapply
に渡されます。だから私が4つのアクションボタンを生成し、アクションボタン#4をクリックすると、シャイニーはその名前を4回印刷しますが、他のボタンはすべて反応しません。 lapply
を使用してオブザーバーを生成する
アイデアは、すべてがそう長くactionButtonは一度だけ押された正常に動作しますあなたの例ではhttps://github.com/rstudio/shiny/issues/167#issuecomment-152598096
これは「lapply」にリスト過去にのみ、最後の項目のオブザーバーを生成する問題は光沢があり、Rのバージョン間の互換性の一つであったということだけであるノート私がインストールしたRの最新バージョンでは、私のサンプルコードは以下のように動作し、それがそうであると言い、解決策が提供されます。 –