Reputation: 798
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
Reputation: 887691
The variable going into the bar_plot
is a string. We can convert to sym
bol 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
-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