Flexdashboard, rhandsontable: как программно получить доступ к пользовательской обновленной таблице? - PullRequest
0 голосов
/ 10 декабря 2018

Не блестящий программист.Простой вопросRhandsontable в приложении Flexdashboard.Как получить доступ к колонке, обновленной пользователем?Пример кода:

---
title: "Test"
runtime: shiny
output: 
      flexdashboard::flex_dashboard:
      orientation: columns
      vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
require(dplyr)
require(tidyverse)
require(rhandsontable)

hour <- 1:24
required <- c(2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 4, 4, 3, 3, 3, 3, 6, 6, 5, 5, 5, 5, 3, 3)
required <- as.integer(required)
on_duty <- as.integer(rep(0, 24))
start <- on_duty

df <- data.frame(hour, required, on_duty, start)

```
Inputs {.sidebar data-width=w}
-----------------------------------------------------------------------

```{r Inputs}

```

Column {data-width=200}
-----------------------------------------------------------------------

### Chart A

```{r}

global <- reactiveValues(df = df)

rHandsontableOutput("dftbl1")

    output$dftbl1 = renderRHandsontable({
    rhandsontable(global$df, selectCallback = TRUE, readOnly = FALSE)
    })

```

Таким образом, код отображает таблицу.Пользователь может обновить таблицу, отредактировав ячейки таблицы.Но тогда как ссылаться на обновленную таблицу для передачи столбцов таблицы в функцию, вызываемую с помощью actionButton?Сложные примеры, которые я нашел, трудно расшифровать.Ценю любые отзывы.SteveM

1 Ответ

0 голосов
/ 11 декабря 2018

вы можете использовать hot_to_r как в

modified_table <- reactive({
  hot_to_r(req(input$table_id)) ## req!
})

, чтобы получить доступ к текущему состоянию таблицы, включая изменения от пользователя.req необходим, потому что hot_to_r не может справиться с NULL s.table_id должен быть выходным идентификатором, который вы используете для возвращаемого значения renderRHandsontable.

output$table_id <- renderRHandsontable({ 
  rhandsontable(initial_table) ## need to call converter
})

Комплексные проверки, на которые вы ссылаетесь (например, этот , # 64-81) разрешить двустороннее соединение таблиц в том смысле, что они могут обновляться как от пользователя, так и от сервера.Однако в этой простой настройке, которую я изложил здесь, modified_table создается с reactive, поэтому он может обновляться только пользователем.

Я полностью согласен, что этот пакет можно сделать более удобным для пользователя, разрешив NULL в hot_to_r и путем автоматического вызова rhandsontable в renderRHandsontable, если возвращаемое значение равно data.frame, но это то, с чем вам придется работать.

Вот полное приложение, демонстрирующее эту настройку

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  rHandsontableOutput("table_id"),
  tableOutput("second_table")
)

server <- function(input, output, session) {
  initial_table <- head(iris)

  output$table_id <- renderRHandsontable({
    rhandsontable(initial_table) ## need to call converter
  })

  modified_table <- reactive({
    hot_to_r(req(input$table_id)) ## req!
  })

  output$second_table <- renderTable({
    modified_table()
  })
}

shinyApp(ui, server)

Чтобы получить доступ к определенному столбцу, вы можете использовать modified_table()$column_name внутри реактивного контекста.

...