r闪亮的Rhandsontable:创建用于复制和粘贴数据的空表

时间:2018-07-03 13:54:30

标签: r shiny rhandsontable

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

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  

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

Error: need finite 'xlim' values

将数据粘贴到表中时,错误消息消失。
我认为错误是由于首次调用plot函数时缺少数据所致。在github上,我找到了添加

的建议
if(is.null(data$values)) return(NULL)  

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

1 个答案:

答案 0 :(得分:0)

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

要回答您的主要问题:为什么会收到错误消息 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而什么也没有发生,如果没有,则将出现图。