writer_typer
writer_typer

Reputation: 798

Error in : Only strings can be converted to symbols in Shiny ggplot

I tried to create a ggplot using a function I created in shiny, but I'm getting this

Error in : Only strings can be converted to symbols

I had a similar issue and it was fixed by using this in the fre function

var_str1 <- var
var <- rlang::ensym(var)

I tried to do the same with the bar_plot function, but it didn't work.

Code


library(shiny)
library(questionr)
library(dplyr)
library(ggplot2)
library(tidyr)
library(haven)
library(labelled)
library(scales)
library(sjlabelled)


fre <- function(var) {
  var_str1 <- var
  var <- rlang::ensym(var)
  
  abc <- questionr::na.rm(dat[, var_str1])
  abc <- questionr::freq(abc, total = TRUE, na.last = TRUE, digits = 2)
  abc <- cbind(Label = rownames(abc), abc)
  abc <- questionr::rename.variable(abc, "n", "Frequency")
  abc <- questionr::rename.variable(abc, "%", "Percent")
  abc <- tidyr::separate(abc, Label, into = c("Value", "Label"),
                         sep = "] ")
  row.names(abc) <- NULL
  abc <- abc %>% dplyr::mutate(Value = gsub("[[:punct:]]", '', Value)) %>% 
    dplyr::select(Label, Value, Frequency, Percent)
  abc
}

bar_plot <- function(data, var) {
  
  data <- do.call(as_label, list(data, ensym(var)))
  
  data %>% 
    filter({{ var }} != "Neither") %>% 
    ggplot(aes({{ var }})) +
    geom_bar() +
    coord_flip() +
    theme_classic() +
    labs(x = NULL, y = "Count", title = var_label(pull(data, {{ var }})))
}


dat <- read_spss("http://staff.bath.ac.uk/pssiw/stats2/SAQ.sav")



ui <- fluidPage(

    titlePanel(" "),
     sidebarLayout(
        sidebarPanel(
            selectInput("var1", "Frequency Table", choices =  names(dat), selected = NULL)
        ),

        mainPanel(
           tableOutput("fretab"),
           plotOutput("barplot")
        )
    )
)


server <- function(input, output) {

    output$fretab <- renderTable({
        fre(input$var1)
    })
    
    output$barplot <- renderPlot({
      bar_plot(dat, input$var1)
    })
}


shinyApp(ui = ui, server = server)

Upvotes: 1

Views: 1688

Answers (1)

akrun
akrun

Reputation: 887691

The variable going into the bar_plot is a string. We can convert to symbol and use !!

bar_plot <- function(data, var) {
  var1 <- var
  data <- do.call(as_label, list(data, ensym(var)))
  
  data %>% 
    filter((!! rlang::sym(var1)) != "Neither") %>% 
    ggplot(aes(!! rlang::sym(var1))) +
    geom_bar() +
    coord_flip() +
    theme_classic() +
    labs(x = NULL, y = "Count", title = var_label(pull(data, !! rlang::sym(var1))))
}

-output

enter image description here

-full code

library(shiny)
library(questionr)
library(dplyr)
library(ggplot2)
library(tidyr)
library(haven)
library(labelled)
library(scales)
library(sjlabelled)


fre <- function(var) {
  var_str1 <- var
  var <- rlang::ensym(var)
  
  abc <- questionr::na.rm(dat[, var_str1])
  abc <- questionr::freq(abc, total = TRUE, na.last = TRUE, digits = 2)
  abc <- cbind(Label = rownames(abc), abc)
  abc <- questionr::rename.variable(abc, "n", "Frequency")
  abc <- questionr::rename.variable(abc, "%", "Percent")
  abc <- tidyr::separate(abc, Label, into = c("Value", "Label"),
                         sep = "] ")
  row.names(abc) <- NULL
  abc <- abc %>% dplyr::mutate(Value = gsub("[[:punct:]]", '', Value)) %>% 
    dplyr::select(Label, Value, Frequency, Percent)
  abc
}

bar_plot <- function(data, var) {
  var1 <- var
  data <- do.call(as_label, list(data, ensym(var)))
  
  data %>% 
    filter((!! rlang::sym(var1)) != "Neither") %>% 
    ggplot(aes(!! rlang::sym(var1))) +
    geom_bar() +
    coord_flip() +
    theme_classic() +
    labs(x = NULL, y = "Count", title = var_label(pull(data, !! rlang::sym(var1))))
}


dat <- read_spss("http://staff.bath.ac.uk/pssiw/stats2/SAQ.sav")



ui <- fluidPage(
  
  titlePanel(" "),
  sidebarLayout(
    sidebarPanel(
      selectInput("var1", "Frequency Table", choices =  names(dat), selected = NULL)
    ),
    
    mainPanel(
      tableOutput("fretab"),
      plotOutput("barplot")
    )
  )
)


server <- function(input, output) {
  
  output$fretab <- renderTable({
    fre(input$var1)
  })
  
  output$barplot <- renderPlot({
    bar_plot(dat, input$var1)
  })
}


shinyApp(ui = ui, server = server)

Upvotes: 4

Related Questions