在闪亮页面中使用可变数量的输入字段 [英] Using variable number of input fields in shiny page

查看:42
本文介绍了在闪亮页面中使用可变数量的输入字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题如下:

我有一个闪亮的应用程序,它根据用户输入显示可变数量的输出元素(例如,详述于:使用shiny 动态地将绘图添加到网页).

I have a shiny application that displays a variable number of output elements based on user input (as, for example, is detailed in: dynamically add plots to web page using shiny).

但是,我还想向每个输出元素添加一个输入元素,允许用户为输出指定一些修饰符(例如,让用户在将每个元素视为图表或表格之间进行选择,但一个可以推广到对输出数量可变的任何类型的修改).

However, I'd also like to add to each output element an input element allowing the user to specify some modifier for the output (for example, let the user choose between viewing each element as a plot or a table, but one can generalize for any kind of modification to the variable number of outputs).

我认为最简单的方法是向每个元素添加一个 selectInput 元素,其中包含我希望用户拥有的选项.我的问题是每次渲染页面时,selectInput 元素似乎都恢复到它们的初始值,因此更改它们没有任何效果(实际上,它们确实有效果,但随后它们被重置,效果是已恢复).

I figured the easiest way to do that would be to add to every element a selectInput element with the choices I want the user to have. My problem is that every time the page is rendered, the selectInput elements seem to revert to their initial values, so that changing them has no effect (actually, for an instant they do have an effect, but then they are reset and the effect is reverted).

以下代码重现了问题(根据@skasch 对上述问题的回答进行了修改):

The following code reproduces the problem (modified based on the answer by @skasch to the above mentioned question):

server.R

library(shiny)
max_plots <- 5

shinyServer(function(input, output) {

# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
  plot_output_list <- lapply(1:input$n, function(i) {
     modifier <- paste("select",i,sep="")
     plotname <- paste("plot", i, sep="")
     plottitle <- paste("plottitle", i, sep="")
     tablename <- paste("tablename", i, sep="")

     # By default I display a plot
     disp <- plotOutput(plotname, height = 280, width = 250)  
     # modifier may not be in the input if this is the first time the element is displayed
     if(modifier %in% names(input) && input[[modifier]] == "table") {
       disp = tableOutput(tablename)
     }
     # Make the output element display properly:
     tagList(
       textOutput(plottitle, container = h3),
       uiOutput(modifier),
       disp)
   })    
   # Convert the list to a tagList - this is necessary for the list of items
   # to display properly.
   do.call(tagList, plot_output_list)
})

# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots) {
    # Need local so that each item gets its own number. Without it, the value
    # of i in the renderPlot() will be the same across all instances, because
    # of when the expression is evaluated.
    local({
        my_i <- i
        modifier <- paste("select",i,sep="")
        plotname <- paste("plot", my_i, sep="")
        plottitle <- paste("plottitle", my_i, sep="")
        tablename <- paste("tablename", my_i, sep="")

        output[[plotname]] <- renderPlot({
        plot(1:my_i, 1:my_i, xlim = c(1, max_plots), ylim = c(1, max_plots), main = paste("1:", my_i, ".  n is ", input$n, sep = ""))
        })
        output[[plottitle]] <- renderText({paste("1:", my_i, ".  n is ", input$n, sep = "")
        })
        output[[tablename]] <- renderTable({table(x = 1:my_i, y = 1:my_i)
        })
        # I suspect the problem is the re-evaluation of this part that resets the "selected" field
        output[[modifier]] <- renderUI({selectInput(
                                          inputId = modifier,
                                          label="select how to display",
                                          choices = c("plot","table"),
                                          selected = 1)})
    })
}
})

ui.r

library(shiny)
shinyUI(pageWithSidebar(

  headerPanel("Dynamic number of plots"),

    sidebarPanel(
      sliderInput("n", "Number of plots", value=1, min=1, max=5)
    ),

    mainPanel(
      uiOutput("plots") # This is the dynamic UI for the plots
    )
))

推荐答案

虽然我认为它不是一个理想的解决方案,但指定:

While I don't find it to be an ideal solution, assigning:

output[[modifier]] <- renderUI({selectInput(
                                      inputId = modifier,
                                      label="select how to display",
                                      choices = c("plot","table"),
                                      selected = input[[modifier]])})

解决了问题,但我很乐意得到更好的解决方案(特别是避免每次重新构建输入对象的解决方案).

solves the problem, though I'd be happy to get a better solution (specifically one that avoids the construction of the input object every time anew).

这篇关于在闪亮页面中使用可变数量的输入字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆