使用checkboxGroupInput的长度作为循环的输入来创建多个元素

时间:2015-11-12 13:21:39

标签: r shiny

我正在创建Shiny应用程序,我想使用checkboxGroupInput打印多个图。但是,我想打印出仅用于已检查的checkboxGroupInput元素的图。在Shiny gallery中有一个类似的example来创建一个使用lapply的循环中的UI元素。以下是该示例的简化版本,以显示我想要做的事情:

numberInput()[i]

这很有效,但很明显,当Shiny试图提取i lapply大于当前已检查元素的数量时,没有什么可以提取而不是绘图有错误。因此,我需要以某种方式告诉nn length(input$checkbox) length(input$checkbox) numberInput()次。{/ 1}}。

我尝试直接使用reactiveValues(),尝试将该元素放入 v <- reactiveValues(n = length(input$checkbox)) lapply(1:isolate(v$n), function(i) { 被动语句并将其作为列表返回,我尝试以下列方式使用/** * Example model. * * @module model/example */ module.exports = (function () { /** * Constructor function. * * @exports model/example.Example * @constructor * @param {string} id */ var example = function Example(id) { this.id = id; }; /** * Returns the ID. * * @memberof model/example.Example * @returns {string} the id */ example.prototype.getId = function () { return this.id; }; return example; }());

var example = new Example("ID");
console.log(example.getId());

然而,在所有这些情况下,Shiny抱怨缺乏积极的反应背景。

那么,我错过了什么?如何在反应性上下文之外的lapply中使用输入的长度?

1 个答案:

答案 0 :(得分:1)

我通常使用this approach获得更多运气(只是因为我更容易绕过它),但我们的想法是将你的情节呈现在服务器,然后在ui.R

中呈现UI
#server.R
library(shiny)
library(ggplot2)

server <- shinyServer(function(input, output, session) {
  output$checks <- renderText(input$checkbox)

  output$plots <- renderUI({
    plot_output_list <- 
      lapply(input$checkbox,
             function(i){ 
               plotOutput(paste0("plot", i))
             })
    do.call(tagList, plot_output_list)
  })

  observe({
    for (i in input$checkbox) {
      local({
        local_i <- i
        output[[paste0("plot", local_i)]] <- 
          renderPlot({
            qplot(x = rnorm(100, mean = as.numeric(local_i))) +
        ggtitle(paste("This plot was plotted with", local_i, "option"))
          })
      })
    }
  })



})

#ui.R
library(shiny)    
ui <- shinyUI(fluidPage(
  title = 'lapply example',

  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("checkbox", "Checkbox",
                         choices = sample(1:10, 5))
    ),

    mainPanel(
        verbatimTextOutput("checks"),
        uiOutput('plots')
    )
  )
))

shinyApp(ui = ui, server = server)