我正在尝试将ggplot2与闪亮的反应对象一起使用。 因此,我知道被动反应提供了一个需要被改变为值的被动对象,但我试图将它分配给反应部分和renderPlot部分中的不同对象并且没有结果......
所以,如果我不将它分配给另一个变量,我会收到消息:
ggplot2 doesn't know how to deal with data of class
reactiveExpr/reactive
我知道至少有两个问题(here和here)谈论这个问题。我确实做了我的作业并尝试使用这些答案而且它没有用。据我所知,这些答案建议将反应对象分配给另一个变量,我做了,并得到了消息:
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")
)
)
))
答案 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)
})
})