我在一個{Shiny} reactiveValues物件中創建了許多反應元素,所有元素都需要幾乎相同的過濾代碼。但我無法弄清楚如何有效地做到這一點,即不直接為每個元素撰寫過濾代碼。在下面的示例代碼中,一個單選按鈕控制將某些資料過濾為 2 組,A 和 B。好輸出和壞輸出之間的區別在于,壞輸出使用函式來定義其值,而好輸出則指定它直接作為reactive物件。
當使用該函式為壞值創建值時,它似乎停留在初始值上,因為通過選擇不同的組來更改資料時它不會改變。但是,好的確實可以正確過濾資料。那么我們如何在reactiveValues物件中創建許多具有相同代碼的元素呢?
library(shiny)
ui <- fluidPage(
radioButtons(
"group", "",
list(A = "A", B = "B"), list("A"),
inline = TRUE
),
actionButton("go", "Go"),
textOutput("filtered_data_bad"),
textOutput("filtered_data_good")
)
server <- function(input, output) {
data <- tibble(
group = rep(c("A", "B"), c(5, 10))
)
group_saved <- reactiveVal(value = c("A"))
observeEvent(
input$go,
group_saved(input$group),
ignoreInit = TRUE,
ignoreNULL = FALSE
)
filter_data <- function (.data, .group) {
reactive(
.data[.data$group %in% .group,]
)
}
format_text <- function (.data, .group) {
req(nrow(.data) > 0)
paste(
"Selected:",
nrow(.data),
"total"
)
}
rv <- reactiveValues(
bad = filter_data(data, group_saved()),
good = reactive(
data[data$group %in% group_saved(),]
)
)
output$filtered_data_bad <- renderText({
format_text(rv$bad(), group_saved())
})
output$filtered_data_good <- renderText({
format_text(rv$good(), group_saved())
})
}
shinyApp(ui, server)
上面的代碼在顯示問題時盡可能簡單。我正在處理能夠從一個共同的選擇池(實際上是地理區域)中同時選擇許多不同組的要求,reactiveValues每個組將擁有一組選擇。每個組都有自己的reactiveVal物件 ( saved_regions_A, saved_regions_B, ...) 作為過濾器。
regions_saved_A <- reactiveVal(value = regions)
regions_saved_B <- reactiveVal(value = NULL)
regions_saved_C <- reactiveVal(value = NULL)
...
filter_data <- function (.data, .regions) {
reactive(.data %>% filter(region %in% .regions))
}
filtered_data <- reactiveValues(
A = filter_data(data, regions_saved_A()),
B = filter_data(data, regions_saved_B()),
C = filter_data(data, regions_saved_C()),
...
)
我已經嘗試reactive從函式中洗掉呼叫并使用函式呼叫對每個值進行呼叫(這似乎是需要的,因為我依賴 areactiveVal來保存選擇)。以下都不起作用:
filter_data <- function (.data, .regions) {
.data %>% filter(region %in% .regions)
}
filtered_data <- reactiveValues(
A = reactive(filter_data(data, regions_saved_A())),
B = filter_data(data, regions_saved_B()),
...
)
uj5u.com熱心網友回復:
分配reactiveValues一個observer. 無需讓它們再次反應。嘗試這個
library(shiny)
ui <- fluidPage(
radioButtons(
"group", "",
list(A = "A", B = "B"), list("A"),
inline = TRUE
),
actionButton("go", "Go"),
textOutput("filtered_data_bad"),
textOutput("filtered_data_good")
)
server <- function(input, output) {
data <- tibble(
group = rep(c("A", "B"), c(5, 10))
)
group_saved <- reactiveVal(value = c("A"))
observeEvent(
input$go,
group_saved(input$group),
ignoreInit = TRUE,
ignoreNULL = FALSE
)
filter_data <- function (df, .group) {
df[df$group %in% .group,]
# reactive(
# .data[.data$group %in% .group,]
# )
}
format_text <- function (.data, .group) {
req(nrow(.data) > 0)
paste(
"Selected:",
nrow(.data),
"total"
)
}
rv <- reactiveValues(bad=NULL,good=NULL)
observeEvent(input$go, {
group_saved()
rv$bad = filter_data(data, group_saved())
rv$good = data[data$group %in% group_saved(),]
})
output$filtered_data_bad <- renderText({
req(rv$bad)
format_text(rv$bad, group_saved())
})
output$filtered_data_good <- renderText({
req(rv$good)
format_text(rv$good, group_saved())
})
}
shinyApp(ui, server)

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482656.html
