因此,您解决了一个问题并遇到了下一个问题。
我现在已经成功构建了动态创建 uiOutput 的部分代码,即许多滑块、按钮和/或文本字段,它们的数量取决于在更早的步骤中从我的模型中推出的值。
但是,我对如何观察它们是否被用户“点击”/“更改”一无所知。可以说,模型给出了一个 nr 12 然后服务器告诉我的 ui 制作 12 个按钮。我想知道用户何时按下任何按钮以及它是哪个按钮
举一个清晰的例子:如果用户单击按钮 8,我想让 R 告诉我“用户单击按钮 8”。目标是不仅要有动态按钮,还要有对使用它们的动态反应。
我的最终目标之一是收集是/否答案的列表,并为每个元素输入名称。所以我正在寻找一种通用的方法来为按钮“i”或文本字段“j”等挂起条件来观察事件
这是我如何创建动态 UI 的功能齐全的最小示例。
服务器:
shinyServer = function(input, output, session) {
################# start functionality HOME TAB #############################
values <- reactiveValues()
observeEvent(input$myNr, {
values$nrofelements <- input$myNr })
observeEvent(values$nrofelements, {
if (values$nrofelements > 0 & values$nrofelements < 25) {
output$sliders <- renderUI({
lapply(1:values$nrofelements, function(j) {
sliderInput(inputId = paste0("ind", j), label = paste("Individual", j),
min = 0, max = 20000, value = c(0, 500), step = 100)
})
})
output$buttons <- renderUI({
lapply(1:values$nrofelements, function(i) {
div(br(),bsButton(inputId = paste0("indr", i), label = paste("Yes", i), block = FALSE, style = "succes"), br(), br() )
})
})
}
})
observe({
if(values$nrofelements != ""){
for(nr in 1:values$nrofelements){
if(!is.null(input[[paste0("indr", nr)]])) print(paste0("Inputname 'indr", nr, "': ", "value is ", isolate(input[[paste0("indr", nr)]])))
}
}
})
}
和 UI.r
library(shiny)
library(shinydashboard)
library(shinybs)
ui <- dashboardPage(
dashboardHeader(title = "FLOW C.A.R.S."),
dashboardSidebar(
sidebarMenu(id = "tabs", menuItem("Home", tabName = "Home", icon = icon("book"))
)
),
dashboardBody(
tabItems(
### HOME ###_________
tabItem(tabName = "Home", class = 'rightAlign',
h5("Enter desired nr of elements here"),
textInput(inputId ="myNr", label = NULL , placeholder = NULL),
fluidRow(
column(3,
uiOutput("sliders")),
column(1,
uiOutput("buttons")
)
),
textOutput('clickedwhat')
)
)
)
)