以闪亮而不是错误显示空白图

时间:2015-06-15 15:44:53

标签: r shiny r-markdown

当我将反应数据传递给renderPlot(或其他渲染函数)时,数据通常最初为空,直到某些操作发生。默认渲染通常在操作发生之前在应用程序中显示错误,因为数据为空,即

  

错误'x'必须是数字

在这个例子中

。是否有一些标准的方法让渲染函数在没有数据时起作用(如果出现错误或者只是空白则可能无法渲染)?我知道我可以解决构造所有被动值的问题,因此输出将是空白的,但这似乎是不必要的工作。

rMarkdown闪亮的例子

---
title: "Example"
runtime: shiny
output: html_document
---

```{r}
shinyApp(
    shinyUI(fluidPage(
        inputPanel( 
            numericInput("n", "n", 10),
            actionButton("update", "Update")
        ),
        plotOutput("plot")
    )),

    shinyServer(function(input, output) {
        values <- reactiveValues()
        values$data <- c()

        obs <- observe({
            input$update
            isolate({ values$data <- c(values$data, runif(as.numeric(input$n), -10, 10)) })
        }, suspended=TRUE)

        obs2 <- observe({
            if (input$update > 0) obs$resume()
        })

        output$plot <- renderPlot({
            dat <- values$data
            hist(dat)
        })
    }) 
)
```

2 个答案:

答案 0 :(得分:1)

您可以使用c:\Program Files (x86)\Windows Kits\10\References\CommonConfiguration\Neutral函数在尝试绘制变量之前查看变量是否存在,并根据需要进行更改:

MDMERGE : error MDM2012: Error 3 has occured while enumerating files in C:\Program Files (x86)\Windows Kits\10\References\CommonConfiguration\Neutral\*.winmd.

答案 1 :(得分:1)

尝试围绕可能在 tryCatch 中出错的行。在你的例子中,hist(dat) 是什么错误,所以像这样包围它:

tryCatch(
  { hist(dat) }, # Code that might error goes here, between the { }
  error = function(e) {""} # Leave this line as-is.
)

那是闪亮的:

  • 尝试运行 hist(dat),并且
  • 如果你不能在没有错误的情况下运行它,只需显示一个空字符串。

现在不再有错误消息,您的直方图仍然按预期工作。

工作示例

这是实施了 tryCatch 解决方案的 MRE - 向下滚动到评论显示 # CHANGES HERE 的位置;它只是将 hist(dat) 替换为 4 个 tryCatch() 行 - 这是唯一的变化。

---
title: "Example"
runtime: shiny
output: html_document
---

```{r}
shinyApp(
    shinyUI(fluidPage(
        inputPanel( 
            numericInput("n", "n", 10),
            actionButton("update", "Update")
        ),
        plotOutput("plot")
    )),

    shinyServer(function(input, output) {
      

        values <- reactiveValues()
        values$data <- c()

        obs <- observe({
            input$update
            isolate({ values$data <- c(values$data, runif(as.numeric(input$n), -10, 10)) })
        }, suspended=TRUE)

        obs2 <- observe({
            if (input$update > 0) obs$resume()
        })

        output$plot <- renderPlot({
            dat <- values$data
            # CHANGES HERE (NEXT 4 LINES)
            tryCatch(
              { hist(dat) }, 
              error = function(e) {""} 
              )
        })
    }) 
)
```