在 Shiny 中无错误地下载反应对象
Error-free download of reactive objects in Shiny
闪亮专家!
在我们的应用程序中,我们有下载情节的下载按钮。该按钮仅在加载和处理某些数据时起作用。当您之前按下按钮时,绘图功能会出现错误消息,因为它没有数据。
content = function(file) {
r <- rChart_line_plot(follow_view_func(),log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
r$save(file, standalone = TRUE)
}
我们想让我们的应用程序万无一失,没有错误。有什么方法可以发送到 downloadHandler 的内容 "NULL"?这行不通。
content = function(file) {
if ( "our data are ready for printing" ) {
r <- rChart_line_plot(follow_view_func(),log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
r$save(file, standalone = TRUE)
} else {
NULL
}
}
我们得到:
Error opening file: 2
Error reading: 9
是否有类似 validate() 函数的东西,甚至可以为用户 "Please load file first"
非常感谢。
您想要 validate
声明是正确的。这是一个 link,其中包含 RStudio 团队的描述。这将使您获得信息更丰富的错误消息。您的完整 downloadHandler
函数将如下所示。请注意,这假设您的数据集可能为空。
output$Download <- downloadHandler(
filename = function() {
paste("test.png",sep="")
},
content = function(file) {
myData <- follow_view_func()
validate(
need(!is.null(myData), "Please select valid dataset")
)
r <- rChart_line_plot(myData,log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
r$save(file, standalone = TRUE)
}
)
这里是 iris
数据集的完整可重现示例。
library(shiny)
library(rCharts)
runApp(
list(
ui = pageWithSidebar(
headerPanel("Using 'validate' for useful error messages"),
sidebarPanel(
selectInput("dataset", "Choose a dataset:",
choices = c("null", "iris")),
selectInput(inputId = "x",
label = "Choose X",
choices = c('SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'),
selected = "SepalLength"),
selectInput(inputId = "y",
label = "Choose Y",
choices = c('SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'),
selected = "SepalWidth"),
downloadButton("Download")
),
mainPanel(
showOutput("myChart", "polycharts")
)
),
server = function(input, output) {
datasetInput <- reactive({
switch(input$dataset,
"iris" = iris,
"null" = NULL)
})
myChart <- reactive({
myData <- datasetInput()
validate(
need(!is.null(myData), "Please select valid dataset")
)
names(myData) = gsub("\.", "", names(myData))
p1 <- rPlot(input$x, input$y, data = myData, color = "Species",
facet = "Species", type = 'point')
p1$addParams(dom = 'myChart')
return(p1)
})
output$myChart <- renderChart({myChart()})
output$Download <- downloadHandler(
filename = function() {
paste("test.png",sep="")
},
content = function(file) {
p1 <- myChart()
p1$save(file, standalone = TRUE)
}
)
}
)
)
更新
根据 OP 的要求,下载按钮最好没有任何错误。我能想到的唯一解决方案是将按钮设为 conditionalPanel
。这在直觉上对我来说很有意义,因为如果屏幕上什么都没有,你为什么要下载?上面代码中唯一需要更改的是更改:
downloadButton("Download")
到
conditionalPanel("output.myChart", downloadButton("Download"))
现在只有在创建有效图表时才会显示下载按钮。
闪亮专家!
在我们的应用程序中,我们有下载情节的下载按钮。该按钮仅在加载和处理某些数据时起作用。当您之前按下按钮时,绘图功能会出现错误消息,因为它没有数据。
content = function(file) {
r <- rChart_line_plot(follow_view_func(),log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
r$save(file, standalone = TRUE)
}
我们想让我们的应用程序万无一失,没有错误。有什么方法可以发送到 downloadHandler 的内容 "NULL"?这行不通。
content = function(file) {
if ( "our data are ready for printing" ) {
r <- rChart_line_plot(follow_view_func(),log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
r$save(file, standalone = TRUE)
} else {
NULL
}
}
我们得到:
Error opening file: 2
Error reading: 9
是否有类似 validate() 函数的东西,甚至可以为用户 "Please load file first"
非常感谢。
您想要 validate
声明是正确的。这是一个 link,其中包含 RStudio 团队的描述。这将使您获得信息更丰富的错误消息。您的完整 downloadHandler
函数将如下所示。请注意,这假设您的数据集可能为空。
output$Download <- downloadHandler(
filename = function() {
paste("test.png",sep="")
},
content = function(file) {
myData <- follow_view_func()
validate(
need(!is.null(myData), "Please select valid dataset")
)
r <- rChart_line_plot(myData,log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
r$save(file, standalone = TRUE)
}
)
这里是 iris
数据集的完整可重现示例。
library(shiny)
library(rCharts)
runApp(
list(
ui = pageWithSidebar(
headerPanel("Using 'validate' for useful error messages"),
sidebarPanel(
selectInput("dataset", "Choose a dataset:",
choices = c("null", "iris")),
selectInput(inputId = "x",
label = "Choose X",
choices = c('SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'),
selected = "SepalLength"),
selectInput(inputId = "y",
label = "Choose Y",
choices = c('SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'),
selected = "SepalWidth"),
downloadButton("Download")
),
mainPanel(
showOutput("myChart", "polycharts")
)
),
server = function(input, output) {
datasetInput <- reactive({
switch(input$dataset,
"iris" = iris,
"null" = NULL)
})
myChart <- reactive({
myData <- datasetInput()
validate(
need(!is.null(myData), "Please select valid dataset")
)
names(myData) = gsub("\.", "", names(myData))
p1 <- rPlot(input$x, input$y, data = myData, color = "Species",
facet = "Species", type = 'point')
p1$addParams(dom = 'myChart')
return(p1)
})
output$myChart <- renderChart({myChart()})
output$Download <- downloadHandler(
filename = function() {
paste("test.png",sep="")
},
content = function(file) {
p1 <- myChart()
p1$save(file, standalone = TRUE)
}
)
}
)
)
更新
根据 OP 的要求,下载按钮最好没有任何错误。我能想到的唯一解决方案是将按钮设为 conditionalPanel
。这在直觉上对我来说很有意义,因为如果屏幕上什么都没有,你为什么要下载?上面代码中唯一需要更改的是更改:
downloadButton("Download")
到
conditionalPanel("output.myChart", downloadButton("Download"))
现在只有在创建有效图表时才会显示下载按钮。