R Shiny 保存反应性 ggplots
R Shiny saving reactive ggplots
我正在尝试弄清楚如何在我的 R Shiny 项目中保存反应性 ggplot。我遵循了 this 指南以及 R Shiny 网站上的指南。但是,我认为我可能遇到问题,因为我使用的是反应图。
这是我目前的代码。
ui <- fluidPage(
dashboardBody(
fluidRow(uiOutput('topbox')),
fluidRow(
tabBox(
id = 'tabset1',
width = '100%',
tabPanel('Grades Graph', downloadButton('Download'), plotOutput('individualGraph')),
)
)
)
)
server <- function(input, output, session) {
grades <- reactive({
req(input$file)
inFile <- input$file
if (endsWith(inFile$name, '.xlsx')){
gradesTbl <- read_excel(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = as.Date(Date))
return(gradesTbl)
} else if (endsWith(inFile$name, 'csv')){
gradesTbl <- read_csv(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = mdy(Date))
return(gradesTbl)
}
})
output$Download <- downloadHandler(
filename = function(){
paste('test', '.png', sep = '')
},
content = function(file){
ggsave(file, plot = output$individualGraph, device = 'png')
}
)
indivdf <- function(){
data.frame(grades()) %>%
filter((Student == input$studentVar) & (Period == input$periodVar) & (Type %in% input$typeVar) & (Unit %in% input$unitVar))
}
output$individualGraph <- renderPlot({
req(input$periodVar)
indivdf() %>%
ggplot(aes(x = Date, y = Grade,
color = Type, shape = Unit)) +
geom_point(size = 4) +
ggtitle(paste(input$studentVar, "'s Individual Grades", sep = '')) +
plotTheme() +
scale_shape_manual(values = 1:10) +
facet_wrap(Unit~.) +
scale_color_manual(values = c('#E51A1D', '#377DB9', '#4EAE4A'))
})
shinyApp(ui = ui, server = server)
完整代码是 here,但我认为这就是展示我正在尝试做的一切。我只是不知道如何保存这些反应性的表格和图表。我感觉跟使用'plot = output$indididualGraph'有关,但我真的不知道。
您需要获取生成绘图的代码并将其从 renderPlot
移动到 reactive
。
然后,您可以从 renderPlot
内部调用相同的 reactive
以在 UI 中显示图形,并从您的 downloadHandler
中调用以下载绘图。
参见下面的示例。
对反应式 (individualGraph()
) 和输出 return (output$individualGraph
) 使用相同的变量名可能不是最佳编码实践,但我发现它更方便。
server <- function(input, output, session) {
individualGraph <- reactive({
req(input$periodVar)
indivdf() %>%
ggplot(aes(x = Date, y = Grade,
color = Type, shape = Unit)) +
geom_point(size = 4) +
ggtitle(paste(input$studentVar, "'s Individual Grades", sep = '')) +
plotTheme() +
scale_shape_manual(values = 1:10) +
facet_wrap(Unit~.) +
scale_color_manual(values = c('#E51A1D', '#377DB9', '#4EAE4A'))
})
output$individualGraph <- renderPlot({
req(individualGraph())
individualGraph()
})
output$Download <- downloadHandler(
filename = function(){
paste('test', '.png', sep = '')
},
content = function(file){
req(individualGraph())
ggsave(file, plot = individualGraph(), device = 'png')
}
)
grades <- reactive({
req(input$file)
inFile <- input$file
if (endsWith(inFile$name, '.xlsx')){
gradesTbl <- read_excel(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = as.Date(Date))
return(gradesTbl)
} else if (endsWith(inFile$name, 'csv')){
gradesTbl <- read_csv(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = mdy(Date))
return(gradesTbl)
}
})
indivdf <- function(){
data.frame(grades()) %>%
filter((Student == input$studentVar) & (Period == input$periodVar) & (Type %in% input$typeVar) & (Unit %in% input$unitVar))
}
}
我正在尝试弄清楚如何在我的 R Shiny 项目中保存反应性 ggplot。我遵循了 this 指南以及 R Shiny 网站上的指南。但是,我认为我可能遇到问题,因为我使用的是反应图。
这是我目前的代码。
ui <- fluidPage(
dashboardBody(
fluidRow(uiOutput('topbox')),
fluidRow(
tabBox(
id = 'tabset1',
width = '100%',
tabPanel('Grades Graph', downloadButton('Download'), plotOutput('individualGraph')),
)
)
)
)
server <- function(input, output, session) {
grades <- reactive({
req(input$file)
inFile <- input$file
if (endsWith(inFile$name, '.xlsx')){
gradesTbl <- read_excel(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = as.Date(Date))
return(gradesTbl)
} else if (endsWith(inFile$name, 'csv')){
gradesTbl <- read_csv(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = mdy(Date))
return(gradesTbl)
}
})
output$Download <- downloadHandler(
filename = function(){
paste('test', '.png', sep = '')
},
content = function(file){
ggsave(file, plot = output$individualGraph, device = 'png')
}
)
indivdf <- function(){
data.frame(grades()) %>%
filter((Student == input$studentVar) & (Period == input$periodVar) & (Type %in% input$typeVar) & (Unit %in% input$unitVar))
}
output$individualGraph <- renderPlot({
req(input$periodVar)
indivdf() %>%
ggplot(aes(x = Date, y = Grade,
color = Type, shape = Unit)) +
geom_point(size = 4) +
ggtitle(paste(input$studentVar, "'s Individual Grades", sep = '')) +
plotTheme() +
scale_shape_manual(values = 1:10) +
facet_wrap(Unit~.) +
scale_color_manual(values = c('#E51A1D', '#377DB9', '#4EAE4A'))
})
shinyApp(ui = ui, server = server)
完整代码是 here,但我认为这就是展示我正在尝试做的一切。我只是不知道如何保存这些反应性的表格和图表。我感觉跟使用'plot = output$indididualGraph'有关,但我真的不知道。
您需要获取生成绘图的代码并将其从 renderPlot
移动到 reactive
。
然后,您可以从 renderPlot
内部调用相同的 reactive
以在 UI 中显示图形,并从您的 downloadHandler
中调用以下载绘图。
参见下面的示例。
对反应式 (individualGraph()
) 和输出 return (output$individualGraph
) 使用相同的变量名可能不是最佳编码实践,但我发现它更方便。
server <- function(input, output, session) {
individualGraph <- reactive({
req(input$periodVar)
indivdf() %>%
ggplot(aes(x = Date, y = Grade,
color = Type, shape = Unit)) +
geom_point(size = 4) +
ggtitle(paste(input$studentVar, "'s Individual Grades", sep = '')) +
plotTheme() +
scale_shape_manual(values = 1:10) +
facet_wrap(Unit~.) +
scale_color_manual(values = c('#E51A1D', '#377DB9', '#4EAE4A'))
})
output$individualGraph <- renderPlot({
req(individualGraph())
individualGraph()
})
output$Download <- downloadHandler(
filename = function(){
paste('test', '.png', sep = '')
},
content = function(file){
req(individualGraph())
ggsave(file, plot = individualGraph(), device = 'png')
}
)
grades <- reactive({
req(input$file)
inFile <- input$file
if (endsWith(inFile$name, '.xlsx')){
gradesTbl <- read_excel(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = as.Date(Date))
return(gradesTbl)
} else if (endsWith(inFile$name, 'csv')){
gradesTbl <- read_csv(inFile$datapath)
gradesTbl <- gradesTbl %>%
arrange(Period, Student, Date, Type) %>%
mutate(Date = mdy(Date))
return(gradesTbl)
}
})
indivdf <- function(){
data.frame(grades()) %>%
filter((Student == input$studentVar) & (Period == input$periodVar) & (Type %in% input$typeVar) & (Unit %in% input$unitVar))
}
}