我正在尝试使用数据reactive()下创建的变量。以下是我的代码。这是一个随时可用的例子
library(shiny)
shinyUI(fluidPage(
titlePanel("Old Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
selectInput("var",
label = "Choose a Group to Display",
choices = c("4", "6","8"),
selected = "4")
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("Plot1"),
plotOutput("Plot2")
)
)
))
library(shiny)
library(datasets)
library(ggplot2)
cars=mtcars
shinyServer(function(input, output) {
data_rec =reactive({
d=cars[cars$cyl==input$var,]
d1=d[d$am==0,]
list(d=d,d1=d1)
})
output$Plot1 <- renderPlot({
data2=data_rec()
ggplot(data2$d,aes(x=gear,y=wt))+geom_boxplot() })
output$Plot2 <- renderPlot({
ggplot(data2$d1,aes(x=gear,y=wt))+geom_boxplot() })
})
我只能为另一个创建1个图表我收到错误:找不到对象'data2'。帮助我在数据反应中定义变量,然后使用它们进行绘图。
答案 0 :(得分:2)
我认为关于如何在这里确定变量的范围存在一些混淆。 data2
代码块中未定义output$plot2
,并且它与output$plot1
代码块中定义的定义不共享。
我认为这可以做你想要的,虽然我会使用reactiveValues
data_rec
。
library(shiny)
library(datasets)
library(ggplot2)
u <- shinyUI(fluidPage(
titlePanel("Old Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
selectInput("var",
label = "Choose a Group to Display",
choices = c("4", "6","8"),
selected = "4")
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("Plot1"),
plotOutput("Plot2")
)
)
))
cars=mtcars
s <- shinyServer(function(input, output) {
data_rec =reactive({
req(input$var)
d=cars[cars$cyl==input$var,]
d1=d[d$am==0,]
list(d=d,d1=d1)
})
output$Plot1 <- renderPlot({
data2=data_rec()
ggplot(data2$d,aes(x=gear,y=wt))+geom_boxplot()
})
output$Plot2 <- renderPlot({
data2=data_rec()
ggplot(data2$d1,aes(x=gear,y=wt))+geom_boxplot()
})
})
shinyApp(u,s)
得到以下特性:
答案 1 :(得分:2)
您忘记在output$Plot2
中创建数据了。
它应该是这样的:
output$Plot2 <- renderPlot({
data2 <- data1()
data2$d1 %>%
ggplot +
aes(x = gear,y = wt) +
geom_boxplot()
})
你也可以将反应部分直接放在renderPlot函数中,避免让列表与ggplot一起使用......
服务器部分如下所示:
server <- shinyServer(function(input, output) {
output$Plot1 <- renderPlot({
data %>%
filter(cyl == input$var) %>%
ggplot +
aes(x = gear, y = wt) +
geom_boxplot()
})
output$Plot2 <- renderPlot({
data %>%
filter(cyl == input$var & am == 0) %>%
ggplot +
aes(x = gear,y = wt) +
geom_boxplot()
})
})