Изменить значения столбца в r datatable на основе числовых входов - PullRequest
0 голосов
/ 21 марта 2019

Я хочу, чтобы пользователи могли видеть изменения во входных данных, которые будут отражены непосредственно в таблице. Поэтому, как только пользователь изменит числовое значение для ввода 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 Ответ

0 голосов
/ 22 марта 2019

Я считаю, что было бы лучше отредактировать значение столбца внутри реактивной среды 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)
...