Je veux visualiser les catégories de données, mais je n'arrive pas à obtenir ce que je veux avec le code ci-dessous. Lorsque je veux diviser les données en catégories, il les évalue dans leur ensemble. Je n'arrive pas à classer le graphique. Qu'est-ce que je fais mal?

library(shiny)
library(ggplot2)

ui <- fluidPage(

titlePanel("shiny demo"),

 sidebarLayout(

   sidebarPanel(
  
  fileInput(inputId = "file",
            label = "choose file",
            multiple = F),
  
  selectInput("p","variable1",
              choices = c("sex","smoke","happines","city","work")),
  
  selectInput("q", "variable2",
              choices = c("hopefulnes","happines")))
,
mainPanel(
  tabsetPanel(
    
    tabPanel(title = "Data",tableOutput("data_out")),
    
    tabPanel(title = "Bar",plotOutput("barp"))
    
      )
    )
  )
)
server <- function(input,output,session) {

 data <- reactive({
 req(input$file)

 df=read.csv(input$file$datapath,sep = ";",header = T)

 })
 output$data_out <- renderTable({
 data() 
 })
  
 output$barp <- renderPlot({      
 ggplot(data(), aes(input$p, ..count..)) + geom_bar(aes(fill = input$q), position = "dodge")  
 })

}
shinyApp(ui,server)

Données;

id  sex   smoke happines     hopefulness   work city
1   man   yes   very happy   very hopeful   yes   A
2   man   no    very happy   very hopeful   yes   A
3   man   no    unstable     not hopeful    no    C
4   woman no    unstable     not hopeful    yes   A
5   woman no    unstable     not hopeful    yes   B
6   man   yes   very happy   hopeful        yes   C
7   woman yes   happy        unstable       no    D
8   man   yes   not happy    not hopeful    yes   A
9   woman no    not happy    unstable       yes   B
10  man   no    very happy   very hopeful   yes   D

code d'erreur ;

L'entrée dans asJSON(keep_vec_names=TRUE) est un vecteur nommé. Dans une future version de jsonlite, cette option ne sera pas prise en charge et les vecteurs nommés seront traduits en tableaux au lieu d'objets. Si vous voulez une sortie d'objet JSON, veuillez utiliser une liste nommée à la place. Voir ?toJSON.

Merci pour l'aide

0
bbkl 2 oct. 2020 à 23:47

1 réponse

Meilleure réponse

selectInput() est configuré pour sortir une chaîne, tandis que aes() est configuré pour s'attendre à une colonne nommée. Si vous sélectionnez "fumée" à partir de input$p et "bonheur" à partir de input$q, cela est introduit dans la fonction en tant que "smoke" et "happiness", et non smoke et happiness. Par conséquent, cela va tracer comme si vous envoyiez cette fonction :

ggplot(df, aes("smoke", ..count..)) +
  geom_bar(aes(fill = "happiness"), position = "dodge")

enter image description here

Pour gérer la sortie de chaîne de selectInput(), vous devez utiliser aes_string() à la place de aes(). Vous devrez remplacer ..count.. par "..count..", mais cela fonctionnera comme si vous demandiez d'évaluer le morceau de code suivant :

ggplot(df, aes_string("smoke", "..count..")) +
  geom_bar(aes_string(fill = "happiness"), position = "dodge")

enter image description here

L'autre façon de procéder est de maintenir en utilisant aes(), mais d'évaluer simplement la chaîne de input$p et input$q en tant que nom de variable. Vous pouvez utiliser get() pour le faire normalement, donc je pense que cela fonctionnera également dans votre application. Vous n'êtes pas obligé de remplacer ..count.. par "..count.." dans ce cas :

# yields the same plot as above
ggplot(df, aes(get("smoke"), ..count..)) +
  geom_bar(aes(fill = get("happiness")), position = "dodge")
0
chemdork123 2 oct. 2020 à 21:02