Блестящий разум, который реагирует на себя - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать блестящее приложение с потрясающим дизайном. Я хочу, чтобы rhandsontable мог обновлять свои значения в одном из своих столбцов, если соответствующие значения в другом столбце выбраны / отмечены. До сих пор я был в состоянии использовать реактивные события / события наблюдения для изменения выходных значений между двумя объектами, но я не могу обернуть это вокруг себя, то есть, как я могу сделать один раз столбец Rhandsontable реагирующим на другой столбец в той же таблице

Вот простой пример того, что я пытаюсь построить:

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  rHandsontableOutput('table')

)

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

  data <- data.frame(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0), select= as.logical( c(FALSE,FALSE,FALSE)))

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


}) 

shinyApp(ui = ui, server = server)

Так что, если я проверю столбец «Выбрать», столбец «diff» должен дать разницу между столбцами c1 и c2

1 Ответ

0 голосов
/ 13 января 2019

Насколько я понимаю, ваша цель состоит в том, чтобы сделать некоторые вычисления в зависимости от значений какого-либо другого столбца. Поэтому, если, например, установлен флажок в третьем столбце, вы можете вычислить разницу между элементами столбцов 1 и 2.

Если бы у вас был только фрейм данных, это было бы легко, не так ли? Ну, это возможно, используя реактивные значения. Основная идея заключается в том, что вы можете сохранить rhandsontable во фрейме данных в бэкэнде, изменить фрейм данных, а затем снова отобразить измененный фрейм данных в handsontable.

Надеюсь, это поможет:

Более подробный пример реактивных значений вы можете увидеть это: http://stla.github.io/stlapblog/posts/shiny_editTable.html и это: https://www.youtube.com/watch?v=BzE1JmC0F6Q&list=PL6wLL_RojB5wXR3NR3K38sIvexZ_45alY&index=3

library(rhandsontable)
library(shiny)


ui <- fluidPage(
  mainPanel(
    rHandsontableOutput("hot")
  )
)

server = function(input, output, session){

  df<- data.frame(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0), select= as.logical( c(FALSE,FALSE,FALSE)))
  values <- reactiveValues(data = df)

  observe({
    if(!is.null(input$hot)){
      values$data <- as.data.frame(hot_to_r(input$hot))
      isolate(values$data[,'diff'] <- ifelse(values$data[,'select'], values$data[,'c1']-values$data[,'c2'] ,0))
      print(values$data)
      output$hot <- renderRHandsontable({
        rhandsontable(values$data)
      })
    }
  })    

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

}

shinyApp(ui, server)
...