Как вы можете установить строковый аргумент в NULL с помощью rlang (для использования в фасетных переменных)?

Я пытаюсь использовать selectInput для определения фасетов для ggplot, поэтому входными данными для facet_grid является строка или имя столбца. Один из вариантов — «none» (это не один из столбцов). Пример ниже работает до тех пор, пока «none», если он не выбран. Я борюсь с тем, как я могу определить параметры «none» как NULL.

Я пробовал следующее, но получаю следующую ошибку: «Ошибка: cols должно быть NULL или спецификацией vars()».

v <- ifelse(rfacet() == "none", NULL, vars(!!rlang::sym(rfacet())))  
# Module - facets options-------------------------------------------------------

   #UI
   plotOpt_rowfacet_UI <- function(id){
      ns <- NS(id)
      uiOutput(ns("ui_opt_rowfacet"))
   }

   #SERVER
   plotOpt_rowfacet <- function(input, output, session, facet_choices="none"){

        output$ui_opt_rowfacet <- renderUI({
         ns <- session$ns

         selectInput(inputId = ns("opt_rowfacet"), label = "Y-variable:",
          choices = facet_choices,
          selected = "none",
          multiple = FALSE, selectize = FALSE)
        })

        return(reactive(input$opt_rowfacet))  #returns column name as string
   }


library(shiny)
   library(dplyr)
   library(tidyverse)

ui <- fluidPage(

  plotOpt_rowfacet_UI("test1"),
  h4("facet selected ouput from module"),
  verbatimTextOutput("y_out"),
  plotOutput("plot")

)

server <- function(input, output, session){

  rfacet <- callModule(module=plotOpt_rowfacet, id="test1", facet_choices= c("none", "mpg", "disp"))

  output$y_out <- renderPrint({
    str(rfacet())
  })

  #this works except if none is selected
  #how can set to NULL if input="none"
  output$plot <- renderPlot({

    #v <- ifelse(rfacet() == "none", NULL, vars(!!rlang::sym(rfacet())))  

    p <- ggplot(mtcars, aes(x=wt, y=disp))+
        geom_point()+
        facet_grid(rows=vars(cyl), cols=vars(!!rlang::sym(rfacet())))
    print(p)
  })


}

shinyApp(ui, server)

person Jmac    schedule 17.11.2019    source источник


Ответы (1)


Закомментированный вами v был довольно близок, вы можете сделать что-то вроде следующего, чтобы определить output$plot:

output$plot <- renderPlot({
  choice <- rfacet()
  v <- if (choice == "none") NULL else vars(!!rlang::sym(choice))

  ggplot(mtcars, aes(x=wt, y=disp)) +
    geom_point() +
    facet_grid(rows=vars(cyl), cols=v)
})

И обратите внимание на это замечание из документации renderPlot:

С графикой ggplot2 код в renderPlot должен возвращать объект ggplot; если вместо этого код печатает объект ggplot2 с чем-то вроде print(p), то координаты для интерактивной графики не будут должным образом масштабироваться в пространстве данных.

person Alexis    schedule 19.11.2019