r блестящий Rhandsontable: создать пустую таблицу для копирования и вставки данных - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь использовать 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

Сообщение об ошибке исчезает при вставке данных в таблицу.
Я думаю, что ошибка связана с отсутствием данных при первом вызове функции plot. На github нашел совет добавить

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

в функции renderPlot, но, к сожалению, это не помогло.
Я был бы очень рад, если бы кто-нибудь мог помочь мне создать пустую таблицу с rhandsontable, которая могла бы быть заполнена данными путем копирования и вставки.

1 Ответ

0 голосов
/ 03 ноября 2018

Я знаю, что вы задавали этот вопрос довольно давно, но поскольку пока что не найдено решение, позвольте мне предложить одно.

Чтобы ответить на ваш главный вопрос: почему вы получаете сообщение об ошибке 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 и ничего не происходит, если нет, тогда будет график.

...