【发布时间】:2021-11-23 12:10:47
【问题描述】:
如何在另一个observeEvent中重用observeEvent处理的数据?
#ui.r
library(shiny)
library(ggplot2)
library(shinyWidgets)
library(DT)
dataset <- diamonds
shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
actionButton("read", "read_diamonds"),
pickerInput('filter1',
'clarity_Filter1',
choices=c(""),
multiple = TRUE,
options = list(actionsBox=TRUE,liveSearch=TRUE),
),
sliderInput('filter2','table_Filter2', min=0, max=100, value=c(0, 100))
),
mainPanel(
dataTableOutput("display"),
),
)
)
)
#server.r
library(shiny)
library(DT)
function(input, output, session) {
#Initial setting
observeEvent(input$file, {
diamond_df <- diamonds
#filter1 update
clarity_choise <- as.vector(unique(diamond_df$clarity))
updatePickerInput(
session = session,
inputId = "clarity_Filter1",
choices = clarity_choise,
selected = clarity_choise,
options = list(
actionsBox = TRUE,
liveSearch = TRUE
),
)
#filter2 update
max_value <- max(as.numeric((diamond_df$table)))
min_value <- min(as.numeric((diamond_df$table)))
updateSliderInput(
session = session,
inputId = "nega_char_slier",
max = max_value ,
min = min_value ,
value = c(min,max)
)
#display
output$display = renderDataTable(diamond_df,options= list(lengthMenu = c(5, 10, 20), pageLength = 5))
})
#What to do if filter1,2 is updated
observeEvent(c(input$filter1,
input$filter2),{
#data update
diamond_df <- diamond_df %>% filter(clarity %in% input$filter1)
diamond_df <- diamond_df %>% filter(input$filter2[1]<table & input$filter2[2]>table)
#display
output$display = renderDataTable(diamond_df,options= list(lengthMenu = c(5, 10, 20), pageLength = 5))
})
}
你想用示例代码做什么
-
按“阅读”以阅读钻石并更新净度和表。显示数据表。
-
对1中读入的数据更新filter1和filter2,数据也随之更新,显示数据表。
但是因为1的范围和2的范围不同,所以没有数据,出现错误。
警告:过滤器错误:找不到对象'diamond_df'
遇到这种情况我该怎么办?
【问题讨论】:
-
您应该使用
reactiveValues对象在observeEvents之间传递数据。另外,input$file是什么?它没有在 ui 中定义。 -
另外,
output$display应该只定义一次,一旦你有一个reactiveValues对象,它就可以在观察者之外定义。 -
感谢您的评论。我第一次听到反应式价值观。你如何使用它? input$file 是 input$read 中的错误。