ggplot和闪亮:ggplot不知道如何处理被动反应:是的它不是重复

时间:2018-03-23 21:03:09

标签: r ggplot2 shiny

我正在尝试将ggplot2与闪亮的反应对象一起使用。 因此,我知道被动反应提供了一个需要被改变为值的被动对象,但我试图将它分配给反应部分和renderPlot部分中的不同对象并且没有结果......

所以,如果我不将它分配给另一个变量,我会收到消息:

ggplot2 doesn't know how to deal with data of class 
reactiveExpr/reactive

我知道至少有两个问题(herehere)谈论这个问题。我确实做了我的作业并尝试使用这些答案而且它没有用。据我所知,这些答案建议将反应对象分配给另一个变量,我做了,并得到了消息:

Error: object is not a matrix

那里描述的答案并没有真正解释如何解决问题,他们只提供修复该特定示例的代码(一个答案读取"我认为这个特定问题应该通过以下代码解决: "但没有指出代码的哪个部分解决了这个问题。)

请您解释一下,在更一般的情况下如何解决这个问题?

这是一个最小的例子:

server.R

library(shiny)
shinyServer(function(input, output) {
  library(ggplot2)
  library(lme4)
  model1 <- lmList((conc) ~ time | Subject, data = Indometh)
  newpoints <- reactive({data.frame("Subject" = c(1, 4, 2, 5, 6, 3),
                          "conc" = predict(model1, newdata = data.frame(time=input$sliderTime)),
                          "time" = rep(input$sliderTime, 6))
  })

  output$myPlot <- renderPlot({
    newpoints2 <- newpoints()
    g <- ggplot(Indometh, aes(time, (conc), color= Subject)) + geom_point()  +
      stat_smooth(method="lm",fullrange=TRUE, fill=NA)
    newg <- g + geom_point(data = newpoints2, mapping =
                             aes(x = time, y = (conc), color= factor(Subject)))
    print(newg)

  })

})

和ui.R文件:

library(shiny)
shinyUI(fluidPage(

  # Application title
  titlePanel("Concentration of Indomethacin"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("slidertime",
                  "Time:",
                  min = 8,
                  max = 15,
                  value = 8)),

    mainPanel(
       plotOutput("myPlot")
    )
  )
))

1 个答案:

答案 0 :(得分:3)

您的示例的问题在于您使用错误的名称调用输入sliderTime它是slidertime我将服务器更改为此并且它完美无缺。

我是如何解决的?只需在反应式表达式中使用browser(),发现input$sliderTime为NULL,所以我检查名称。

library(shiny)
shinyServer(function(input, output) {
  library(ggplot2)
  library(lme4)
  model1 <- lmList((conc) ~ time | Subject, data = Indometh)
  newpoints <- reactive({
    data.frame("Subject" = c(1, 4, 2, 5, 6, 3),
               "conc" = predict(model1, newdata = data.frame(time=input$slidertime)),
               "time" = rep(input$slidertime, 6))
  })

  output$myPlot <- renderPlot({

    newpoints2 <- newpoints()
    g <- ggplot(Indometh, aes(time, (conc), color= Subject)) + geom_point()  +
      stat_smooth(method="lm",fullrange=TRUE, fill=NA)
    newg <- g + geom_point(data = newpoints2, mapping =
                             aes(x = time, y = (conc), color= factor(Subject)))
    print(newg)

  })

})