R Shiny: Почему не работает ggplot?

Я пытаюсь построить график, используя ggplot2 для следующих данных: data

Name       date   weight   height 
Cat1 2016-03-01 34.20000 22.50000
Cat1 2016-04-01 35.02080 23.01750
Cat1 2016-05-01 35.86130 23.54690
Cat1 2016-06-01 36.72197 24.08848
Cat2 2016-03-01 33.55000 22.96000
Cat2 2016-04-01 33.61710 23.41920
Cat2 2016-05-01 33.68433 23.88758
Cat2 2016-06-01 33.75170 24.36534

Код, который я использую:

library("shiny")
library("xlsx")
library("ggplot2")

animal <- read.xlsx("C:\\data\\animals.xlsx",1)

ui<- fluidPage(
 titlePanel("Animals"),
 sidebarLayout(
 sidebarPanel(
  helpText("Create graph of height or weight animals"),

  selectInput("anim", 
              label = "Choose an animal",
              choices = c("Cat1", "Cat2"),
              selected = "Cat1"),

  selectInput("opti", 
              label = "Option",
              choices = c("weight", "height"),
              selected = "weight")
  ),
  mainPanel(plotOutput("graph"))
))

server <- function(input, output){
   output$graph <- renderPlot({
   p2 <- ggplot(subset(animal, Name %in% input$anim)) + geom_line(aes(x=date, y = input$opti)) 
  print(p2)
})
}
 shinyApp(ui=ui, server= server)

Я не получаю сообщения об ошибке, но график представляет собой прямую линию (график ). Я не понимаю, почему, если я помещаю код в командное окно с помощью ggplot, он действительно работает.


person Hav11    schedule 09.08.2016    source источник


Ответы (1)


Поскольку ваша эстетика y - это вводимые пользователем данные, а не жестко заданный идентификатор R, вам нужно использовать aes_string вместо aes:

p2 = ggplot(subset(animal, Name %in% input$anim)) +
    geom_line(aes_string(x = 'date', y = input$opti))

Обратите внимание, что теперь вам нужны кавычки вокруг эстетики x.

Примечание: вы можете print ggplots, но я всегда нахожу это странным: что означает печать графика? 1 plot вместо этого:

plot(p2)

Он делает то же самое, только выглядит более логичным.


1 Для записи, я знаю, почему ggplot2 предоставляет функцию print. Это изящный трюк. Просто нет смысла называть это явно.

person Konrad Rudolph    schedule 09.08.2016
comment
@jdharrison Нет, они идентичны: identical(ggplot2:::plot.ggplot, ggplot2:::print.ggplot)TRUE. - person Konrad Rudolph; 09.08.2016
comment
Спасибо за ваш ответ! Однако код по-прежнему не работает. Теперь я получаю только пустой сюжет без линии. - person Hav11; 09.08.2016
comment
Думаю, это должен быть aes_string? Так что попробуйте то же самое, но замените «aes_» на «aes_string». - person Pete900; 09.08.2016
comment
@ Pete900 Да, ты прав. Немного раздражает, что правила здесь отличаются от соглашений в dplyr и других пакетах. - person Konrad Rudolph; 09.08.2016
comment
Да! aes_string отлично работает! Большое вам спасибо, я уже часами пытался найти, что не так, но никогда не думал, что это как-то связано с aes / aes_string. Вы спасли меня от лишних часов разочарования! - person Hav11; 09.08.2016