根据 RShiny 中的 renderui 用户输入重新计算 renderplot

Recomputing renderplot based on renderui user input in RShiny

我是 RShiny 和 R 的新手。我正在尝试编写一个 RShiny 应用程序。默认情况下,它最初会使用数据集的前三个变量绘制散点图矩阵。然后,用户可以从完整的变量列表中选择自己的变量 selections。选择变量后,用户将单击操作按钮,然后将使用新 selected 变量重新计算图形。

我使用 selectinput 而不是 checkboxinput 来适应具有许多变量的数据集。我正在使用 iris 数据集。下面的代码生成初始图形并允许用户 select 变量。我只是不知道如何让它重新计算矩阵图。我该怎么做呢?谢谢!

library(shiny)
runApp(list(
  ui = fluidPage(
    cols = colnames(iris),
  headerPanel('Grow Clusters'),

  tabsetPanel(
    tabPanel("Plot",
             sidebarPanel(
              # uiOutput("varselect"),

               selectInput("choose_vars", "Select variables to plot",
                                       choices=colnames(iris), selected=iris[1:3], multiple=T),


               actionButton("submitButton", "Produce Matrix Plot!")

               ),

             mainPanel(

               plotOutput('pairsplot')
             )
    ),

    tabPanel("Summary")
    , 
    tabPanel("Table")
  )  

),
server = function(input, output) {



  selectedData <- reactive({
    cols = colnames(iris)
    selectInput("choose_vars", "Select variables to plot",
                choices=cols, selected=cols[1:3], multiple=T)
  })


  output$pairsplot <- renderPlot({
    pairs(iris[1:3], pch = 21)
    })

  output$varselect <- renderUI({
    iris[input$choose_vars]


    plotOutput("pairsplot")
  })


}

)
)

我认为您正在寻找的是 Chris Beely 博客中的 quo 函数:https://chrisbeeley.net/?p=1116

如果您希望用户传递参数然后将该字符向量转换为对象 r 可以读取您需要使用 quo(input$choose_vars) 然后在绘图中您需要在该传递变量之前添加 !! .请注意,您需要加载 dplyr.

library(shiny)
library(dplyr)
runApp(list(
  ui = fluidPage(
    cols = colnames(iris),
    headerPanel('Grow Clusters'),

    tabsetPanel(
      tabPanel("Plot",
               sidebarPanel(
                 # uiOutput("varselect"),

                 selectInput("choose_vars", "Select variables to plot",
                             choices=colnames(iris), selected=iris[1:3], multiple=T),


                 actionButton("submitButton", "Produce Matrix Plot!")

               ),

               mainPanel(

                 plotOutput('pairsplot')
               )
      ),

      tabPanel("Summary")
      , 
      tabPanel("Table")
    )  

  ),
  server = function(input, output) {



    selectedData <- reactive({
      cols <- colnames(iris)
      selectInput("choose_vars", "Select variables to plot",
                  choices=cols, selected=cols[1:3], multiple=T)
    })


    output$pairsplot <- renderPlot({
      if(is.null(input$choose_vars) || length(input$choose_vars)<2){
        pairs(iris[1:3], pch = 21)
      } else {
        var <- quo(input$choose_vars)
        pairs(iris %>% select(!!var), pch = 21) 
      }
    })

    output$varselect <- renderUI({
      iris[input$choose_vars]


      plotOutput("pairsplot")
    })


  }

)
)