Shiny - Редактирование таблиц с несколькими элементами ввода и вывода - PullRequest
0 голосов
/ 24 сентября 2018

Я работал с этим постом в качестве отправной точки. Обновление handsontable путем редактирования таблицы и / или событияReactive

Очень полезно, но я пытаюсь расширить его, указав количество значений в таблице, а затем обновить график на основе таблицы.значения после редактирования.

Вот что у меня есть.

library(shiny)
library(rhandsontable)
library(colorSpec)

ui <- fluidPage(
  numericInput("x", "number of values", 2),
  rHandsontableOutput('table'),
  textOutput('result'),
  plotOutput('plot'),
  actionButton("recalc", "generate new random vals and calculate")
)


server <- function(input,output,session)({
  values <- reactiveValues(data=as.data.frame(runif(input$x)))

  observe({
    input$recalc
    values$data <- as.data.frame(runif(input$x))
  })

  observe({
    if(!is.null(input$table))
      values$data <- hot_to_r(input$table)
  })


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


  output$result <- renderText({
    sum(values$data)
  })

  output$plot <- reactivePlot({
    barplot(values$data)
  })

})

shinyApp(ui = ui, server = server)

В строке reactiveValues появляется ошибка, потому что я пытаюсь использовать input$x.Предыдущий пост имел жестко закодированное значение 2.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я думаю, что вы были почти там.Однако вы не можете использовать вход для создания реактивного значения.Но это в любом случае не допускается, и вы можете начать его с NULL.

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  numericInput("x", "number of values", 2),
  rHandsontableOutput('table'),
  textOutput('result'),
  plotOutput('plot'),
  actionButton("recalc", "generate new random vals and calculate")
)


server <- function(input,output,session)({
  values <- reactiveValues(data = NULL) ## assign it with NULL

  ## button press resets now the data frame
  observeEvent(input$recalc, { 
    values$data$x <- 0
  })

  ## changes in numericInput sets all (!) new values
  observe({
    req(input$x)
    values$data <- data.frame(x = runif(input$x))
  })

  observe({
    if(!is.null(input$table))
      values$data <- hot_to_r(input$table)
  })


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


  output$result <- renderText({
    req(values$data)
    sum(values$data)
  })

  output$plot <- renderPlot({
    req(values$data)
    barplot(values$data$x)
  })

})

shinyApp(ui = ui, server = server)
0 голосов
/ 25 сентября 2018

Вы можете использовать reactive() вместо reactiveValues, чтобы сделать это:

library(shiny)
library(rhandsontable)
library(colorSpec)

ui <- fluidPage(
  numericInput("x", "number of values", 2),
  rHandsontableOutput('table'),
  textOutput('result')
)


server <- function(input,output,session)({

  values <- reactive({
    foo <- as.data.frame(runif(input$x))
    colnames(foo) <- c("Col1")
    return(foo)
  })

  output$table <- renderRHandsontable({
    rhandsontable(values())
  })


  output$result <- renderText({
    sum(values())
  })

})

shinyApp(ui = ui, server = server)
...