为任意数量的操作按钮

时间:2015-07-02 22:04:30

标签: r rstudio shiny-server shiny

我要做的是创建一个任意数量的操作按钮,每个操作按钮都有自己的事件基于他们自己的个人价值。

我们想说我们要创建一些按钮。我们所做的是绘制1到100之间的随机数,并将其称为 n 。然后我们创建 n 按钮,每个按钮的值在 1 n 之间(每个数字覆盖一次)。然后,当我们按下其中一个按钮时,我们会渲染一条文本消息,即我们按下的数字。

要设置按钮,我们有:

ui.R

shinyUI(fluidPage(
   actionButton('roll','roll'),
   uiOutput('buttons')
))

Server.R

shinyServer(function(input, output) {

  n <- eventReactive(input$roll, {
    num <- sample(1:100,1)
    sample(1:num, num, replace=FALSE)
  })

  output$buttons <- renderUI({
    lapply(1:length(n()), function(i) {
      actionButton(as.character(n()[i]), as.character(n()[i]) )
    })
  })

})

这会生成按钮。但是,我正在努力寻找创建所有必要eventReactive()的方法。我尝试在循环内和eventReactive()调用中调用lapply。但是,为了生成该循环或lapply,您需要length(n())的值,该值只能在另一个被动或观察命令中调用。

鉴于从上面的脚本生成的按钮,我们如何为每个按钮创建一个反应式表达式,然后输出与按下的数字相对应的文本?

1 个答案:

答案 0 :(得分:0)

您可以搜索输入,查找已触发的按钮。单击一个按钮后,其值大于0,因此所有拾取的值都将以这种方式打印(不确定是否需要)?

library(shiny)

shinyApp(
    shinyUI(fluidPage(
        sidebarLayout(
            sidebarPanel(
                actionButton('roll','roll'),
                uiOutput('buttons')
            ),
            mainPanel(
                textOutput('stuff')
            )
        )
    )),
    shinyServer(function(input, output) {

        n <- eventReactive(input$roll, {
            num <- sample(1:100,1)
            sample(1:num, num, replace=FALSE)
        })

        output$buttons <- renderUI({
            lapply(1:length(n()), function(i) {
                actionButton(as.character(n()[i]), as.character(n()[i]) )
            })
        })

        output$stuff <- renderText({
            val <- which(lapply(paste(n()), function(i) input[[i]]) == TRUE)
            if (length(val))
                sprintf("Picked %s!", paste(n())[val])
        })

    })
)