3

我尝试使用 rhandsontable 来构建一个闪亮的应用程序。
当首先运行应用程序时,应该呈现一个空表,然后可以通过复制和粘贴来填充数据。粘贴数据后,应呈现值图。
我的代码如下:

library(shiny)
library(rhandsontable)
library(data.table)

X = c("","","")
Y = c("","","")

daten = data.table(X, Y)

ui <- fluidPage(

  rHandsontableOutput("tabelle"),

  plotOutput("grafik")
 )

server <- function(input, output) {

  data <- reactiveValues(values=daten)

  output$tabelle <- renderRHandsontable({
    rhandsontable(data$values)
  })

  observeEvent(input$tabelle, {
    data$values <- hot_to_r(input$tabelle)
  })

  output$grafik <- renderPlot({
    if(is.null(data$values)) return(NULL)
    plot(data$values)
    })
}

shinyApp(ui, server)  

该应用程序有效,但给出了错误消息

Warning: Error in plot.window: need finite 'xlim' values  

在控制台中并在浏览器窗口中显示错误消息:

错误:需要有限的“xlim”值

将数据粘贴到表中时错误消息消失。
我认为错误是由于第一次调用绘图函数时缺少数据。在 github 我找到了要添加的建议

if(is.null(data$values)) return(NULL)  

在 renderPlot 函数中,但不幸的是这没有帮助。
如果有人可以帮助我用 rhandsontable 创建一个空表,我会非常高兴,该表可以通过复制和粘贴来填充数据。

4

1 回答 1

3

我知道你很久以前就问过这个问题,但是由于到目前为止还没有提供解决方案,所以让我提出一个。

回答您的主要问题:为什么您会收到错误消息 Warning: Error in plot.window: need finite 'xlim' values

答案是:因为您要求R绘制没有值的东西。你测试if(is.null(data$values)). 这可能是一个解决方案。但是,您设置data$values <- hot_to_r(input$tabelle). 因此,它不是NULL

我可以建议您按如下方式更改您的代码(尤其是因为data您的输入值的使用会产生误导,因为它data是一个内置R函数):

library(shiny)
library(rhandsontable)
library(data.table)

X <- c("", "", "")
Y <- c("", "", "")

daten <- data.table(X, Y)

ui <- fluidPage(
  rHandsontableOutput(outputId = "tabelle"),
  plotOutput(outputId = "grafik")
)

server <- function(input, output){
  data.in <- reactiveValues(values = daten)
  output$tabelle <- renderRHandsontable({
    rhandsontable(data.in$values)
  })

  observeEvent(eventExpr = input$tabelle, {
    data.in$values <- hot_to_r(input$tabelle)
    output$grafik <- renderPlot({
      if(!is.null(tryCatch(plot(data.in$values), error = function(e){})))
        {plot(data.in$values)}
    })
  })
}

shinyApp(ui, server)

tryCatch允许您评估表达式,检查是否发生错误,如果是,则error = function(e){}下降NULL并且什么也没有发生,如果不是,则会有一个情节。

于 2018-11-03T20:09:00.390 回答