我正在创建Shiny应用程序,我想使用checkboxGroupInput打印多个图。但是,我想打印出仅用于已检查的checkboxGroupInput元素的图。在Shiny gallery中有一个类似的example来创建一个使用lapply的循环中的UI元素。以下是该示例的简化版本,以显示我想要做的事情:
numberInput()[i]
这很有效,但很明显,当Shiny试图提取i
lapply
大于当前已检查元素的数量时,没有什么可以提取而不是绘图有错误。因此,我需要以某种方式告诉n
仅n
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中使用输入的长度?
答案 0 :(得分:1)
我通常使用this approach获得更多运气(只是因为我更容易绕过它),但我们的想法是将你的情节呈现在服务器,然后在ui.R
#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)