R Shiny:在反应数据框架内创建新列

时间:2017-12-13 17:44:35

标签: r shiny reactive cbind

假设我有一个名为summarized的数据框,其中包含列TY_COMPLY_COMP(以及其他内容)。我可以在R中编写一个函数,在TY_COMPLY_COMP上执行计算,并在数据框中创建一个名为cac的新列,如下所示:

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

cac现在是汇总数据框中的新列。

现在说summarized()是一个具有相同列的反应数据框。

如何在非反应数据帧中实现效果,即在当前帧中创建新列?或者我将如何获得相同的效果?

我试过了:

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

1 个答案:

答案 0 :(得分:1)

我估计您想要修改reactive,例如点击actionButton。为此,我将使用reactiveValues。您可以在reactiveValueobserve等观察者中修改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)