【发布时间】:2017-04-27 18:54:23
【问题描述】:
因此,您解决了一个问题并遇到了下一个问题。
我现在已经成功构建了动态创建 uiOutput 的代码部分,即许多滑块、按钮和/或文本字段,它们的数量取决于在更早的步骤中从我的模型中推出的值。
但是,我很不知道如何观察它们是否被用户“点击”/“更改”。可以说,该模型给出了 nr 12 然后服务器告诉我的用户界面制作 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')
)
)
)
)
【问题讨论】:
-
我尝试编辑以修复这些问题,但我的编辑未获批准。您需要在
shinyServer代码块中包含最后一个},并且您需要在ui代码块中包含最后两个)。此外,您需要包含shinyBS库才能完全重现。