Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Warning jsonlite in shiny: Input to asJSON(keep_vec_names=TRUE) is a named vector

Consider this shiny app:

library(shiny)
library(ggplot2)

ui <- fluidPage(
  radioButtons("type", "Type of plot", choices = c("density", "boxplot")),
  plotOutput("plot")
)

server <- function(input, output){
  output[["plot"]] <- renderPlot({
    if(input$type == "density"){
      ggplot(iris, aes(Sepal.Length)) + geom_density()
    }else{
      ggplot(iris, aes(x = "", y = Sepal.Length)) + geom_boxplot()
    }
  })
}

shinyApp(ui, server)

When I select the radio button "boxplot", this message from the jsonlite package appears in the R console:

Input to asJSON(keep_vec_names=TRUE) is a named vector. In a future version of jsonlite, this option will not be supported, and named vectors will be translated into arrays instead of objects. If you want JSON object output, please use a named list instead. See ?toJSON.

I would like to understand what's going on. What should I do to not get this message ? I fear that my app will be broken with a future version of jsonlite.

like image 237
Stéphane Laurent Avatar asked Oct 18 '19 09:10

Stéphane Laurent


1 Answers

Printing your plot rather than returning the plot object should work:

library(shiny)
library(ggplot2)

ui <- fluidPage(
  radioButtons("type", "Type of plot", choices = c("density", "boxplot")),
  plotOutput("plot")
)

server <- function(input, output){
  output[["plot"]] <- renderPlot({
    if(input$type == "density"){
      ggplot(iris, aes(Sepal.Length)) + geom_density()
    }else{
      print(ggplot(iris, aes(x = "", y = Sepal.Length)) + geom_boxplot())
    }
  })
}

shinyApp(ui, server)

Great reprex, thanks. I recently ran into this issue and this solution worked for my purposes. Hope this helps someone else with the same problem.

There are also some open issues in shiny related to this: https://github.com/rstudio/shiny/issues/2673

like image 52
v44k3 Avatar answered Oct 28 '22 02:10

v44k3