R Shiny:在反应式数据框中创建新列
R Shiny: Creating New Columns Within a Reactive Data Frame
假设我有一个名为 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})
我想您想要修改 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)
假设我有一个名为 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})
我想您想要修改 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)