R Shiny: создание новых столбцов в реактивном фрейме данных

Скажем, у меня есть фрейм данных с именем summarized, который включает столбцы TY_COMP и LY_COMP (среди прочего). Я мог бы написать на R функцию, которая выполняет вычисления для TY_COMP и LY_COMP и создает новый столбец с именем cac во фрейме данных следующим образом:

summarized$cac <- summarized$TY_COMP/summarized$LY_COMP-1

cac теперь является новым столбцом во фрейме сводных данных.

Теперь скажем, что summarized() — это реактивный фрейм данных с теми же столбцами.

Как я могу добиться эффекта, сделанного в нереактивном фрейме данных, т.е. создать новый столбец в текущем фрейме? Или как добиться того же эффекта?

Я пытался:

summarized$cac <- reactive({summarized()$TY_COMP/summarized()$LY_COMP-1})

person epiphius    schedule 13.12.2017    source источник


Ответы (1)


Я думаю, вы хотите изменить reactive, когда, например, щелкнули actionButton. Для этой цели я бы использовал reactiveValues. Вы можете изменить reactiveValue внутри наблюдателей, таких как observe или observeEvent.

Посмотрите на этот простой пример:

summarized <- data.frame(id = 1:20, group = letters[1:4], TY_COMP = runif(20), LY_COMP = runif(20))

library(shiny)

ui <- fluidPage(
  verbatimTextOutput("text"),
  actionButton("btn", "Add the 'cac' column to summarized")
)

server <- function(input, output){
  rv <- reactiveValues(summarized = summarized)

  output$text <- renderPrint(rv$summarized)

  observeEvent(input$btn, {
    rv$summarized$cac <- summarized$TY_COMP / summarized$LY_COMP - 1
  })

  summarized_mod <- reactive({
    summarized()$TY_COMP / summarized()$LY_COMP-1
  })
}

shinyApp(ui, server)

Другой вариант — создать еще один reactive с дополнительным столбцом. Это можно использовать, но в зависимости от вашего варианта использования я рекомендую первое решение.

Пример:

summarized <- data.frame(id = 1:20, group = letters[1:4], TY_COMP = runif(20), LY_COMP = runif(20))

library(shiny)

ui <- fluidPage(
  verbatimTextOutput("text1"),
  verbatimTextOutput("text2")
)

server <- function(input, output){

  output$text1 <- renderPrint(summarized_orig())
  output$text2 <- renderPrint(summarized_mod())


  summarized_orig <- reactive( {
    summarized
  })

  summarized_mod <- reactive({
    df <- summarized_orig()
    df$cac <- summarized_orig()$TY_COMP / summarized_orig()$LY_COMP - 1

    df
  })
}

shinyApp(ui, server)
person GyD    schedule 14.12.2017
comment
В первом примере, почему это делается дважды - summed$TY_COMP/summed$LY_COMP, один раз как реактивный и другой без() - person ashleych; 28.07.2018
comment
Я подумал, что это просто модифицированная версия, однако я не могу использовать модифицированную версию. Я поднял вопрос, связанный с этим, в отдельной теме - person ashleych; 28.07.2018
comment
Столкнулся с аналогичной проблемой, и ваш ответ решил мою проблему с некоторыми изменениями. Супер полезно! - person Seunghoon Jung; 08.05.2021