Изменение значений столбцов в r datatable на основе числовых входных данных

#r #shiny #dt

#r #блестящий #dt

Вопрос:

Я хочу, чтобы пользователи могли видеть изменения во входных данных, которые будут отражены непосредственно в таблице. Таким образом, как только пользователь изменяет числовое значение для ввода lower , это должно отражать изменение в столбце lower_rate в таблице, а также умножать это значение на low_val . Возможно ли это с observeEvent изменением числовых входных данных.

 input_data <- data.frame(lower_rate = c (.5, .5, .5),
                         low_val = c(10,11,12),
                         upper_rate = c(1.5, 1.5, 1.5),
                         upp_val = c(20,21,22),
                         stringsAsFactors = FALSE) 

ui <- shinyUI(
  fluidPage(
    titlePanel("Basic DataTable"),



    # Create a new row for the table.
    fluidRow(
      column(12,

             numericInput("low", label = h3("lower"), value = 0.5),
             numericInput("up", label = h3("Upper"), value = 1.5),
             dataTableOutput(outputId="table")
      )
    )    
  )  
)

server <- shinyServer(function(input, output) {
  d <- reactive({
    input_data
  })

  dat <- reactiveValues(dat=NULL)
  observe({
    dat$dat <- d()
  })

  output$table <- renderDataTable({
    dat$dat
  })
})

shinyApp(ui=ui,server=server)```

  

Ответ №1:

Я считаю, что было бы лучше отредактировать значение столбца внутри реактивной среды renderDataTable . События наблюдения не нужны. Пока вы не используете <<- обозначение для записи в среду, это не изменит исходные данные.

 library(shiny)
library(data.table)

input_data <- data.frame(lower_rate = c(.5, .5, .5),
                         low_val = c(10,11,12),
                         upper_rate = c(1.5, 1.5, 1.5),
                         upp_val = c(20,21,22),
                         stringsAsFactors = FALSE) 

ui <- shinyUI(
  fluidPage(
    titlePanel("Basic DataTable"),



    # Create a new row for the table.
    fluidRow(
      column(12,

             numericInput("low", label = h3("lower"), value = 0.5),
             numericInput("up", label = h3("Upper"), value = 1.5),
             dataTableOutput(outputId="table")
      )
    )    
  )  
)

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

  output$table <- renderDataTable({
    input_data$lower_rate <- input$low
    #it is not clear where you want the multiplied value to end up
    input_data$new_val <-  input$low*input_data$low_val
    data.table(input_data)
  })
})

shinyApp(ui=ui,server=server)