Use reactive expressions in renderPlot and download handler
我在闪亮的应用程序中使用renderPlot()
和downloadHandler()
中的反应式表达式时遇到了问题。我想这样做是为了减少代码中的维护和冗余。
上述问题适用于“普通”绘图函数,如plot,hist等。 在我的应用程序中,我使用了一个更复杂的函数来创建一个图。我已经创建了它的简化版本
helpfunc <- function(mean, sd) {
hist(rnorm(1000, mean, sd))
lines(1:10)
}
如果您现在在shiny app
中使用此功能,则在创建反应式表达式时它不起作用。既不使用plot()
也不使用反应表达本身。
mwe <- function() {
app = list(
ui = bootstrapPage(
fluidPage(
sidebarPanel(
sliderInput("mean", "choose mean", -10, 10, 1),
sliderInput("sd", "choose sd", 0, 5, 1)),
mainPanel(
plotOutput("hist"),
downloadButton("histDownload")
)
)
),
server = function(input, output) {
output$hist <- renderPlot(.hist())
.hist <- reactive(helpfunc(input$mean, input$sd))
output$histDownload <- downloadHandler(
filename = function() {
paste("hist.jpg")
},
content = function(file) {
jpeg(file, quality = 100, width = 800, height = 800)
.hist() ## works not for plot(.hist()) either
dev.off()
}
)
}
答案 0 :(得分:2)
lines
基本上是对plot.xy
的调用。您遇到的问题与之前的问题相同,但这次您无法分配lines
的输出。和以前一样,您可以分配hist
函数的输出。
helpfunc <- function(mean, sd) {
hist = hist(rnorm(1000, mean, sd))
myLines = function(){lines(1:10)}
myLines()
list(hist = hist, lines = myLines)
}
mwe2 <- function() {
app = list(
ui = bootstrapPage(
fluidPage(
sidebarPanel(
sliderInput("mean", "choose mean", -10, 10, 1),
sliderInput("sd", "choose sd", 0, 5, 1)),
mainPanel(
plotOutput("hist"),
downloadButton("histDownload")
)
)
),
server = function(input, output) {
output$hist <- renderPlot(.hist())
.hist <- reactive(helpfunc(input$mean, input$sd))
output$histDownload <- downloadHandler(
filename = function() {
paste("hist.jpg")
},
content = function(file) {
myHist <- .hist()
jpeg(file, quality = 100, width = 800, height = 800)
plot(myHist$hist)
myHist$lines()
dev.off()
}
)
}
)
runApp(app)
}