Shiny中更新reactiveVal时遇Unused Argument Error的技术求助
解决Shiny中reactiveVal更新数据的问题
你遇到的错误根源是dat2被定义成了reactive()响应式表达式,这类表达式是只读的,只能通过dat2()获取值,不能像函数传参那样更新它。要实现可更新的响应式变量,必须用reactiveVal()来创建。
以下是修正后的完整代码,关键改动已标注:
library(shiny) library(tidyverse) ui <- fluidPage( sidebarPanel( actionButton('getdata', 'Get Data') ), mainPanel( plotOutput('plot', brush = brushOpts(id = 'brush'), dblclick = 'dclick') ) ) server <- function(input, output, session) { dat <- eventReactive(input$getdata, { tibble('BusDate' = Sys.Date() - 0:10, 'Val' = rnorm(11)) }) # 1. 用reactiveVal()创建可读写的响应式变量,初始值设为NULL dat2 <- reactiveVal() # 2. 获取数据后,初始化dat2的值 observeEvent(input$getdata, { dat2(dat()) }) observeEvent(input$dclick, { brush <- input$brush max_x <- brush$xmax min_x <- brush$xmin if (is.null(min_x)){ # 3. 更新dat2的值,直接调用dat2(新值) dat2(dat()) }else{ dat2(dat() %>% filter(BusDate > min_x & BusDate < max_x)) } }, ignoreInit = TRUE) output$plot <- renderPlot({ # 4. 获取dat2当前值,直接调用dat2() ggplot(dat2(), aes(x = BusDate, y = Val)) + geom_line() }) } shinyApp(ui, server)
核心说明:
reactiveVal()创建的是一个可读写的响应式容器:调用dat2()是获取当前值,调用dat2(新值)是设置新值,这是和reactive()最本质的区别。- 必须在获取数据后(
input$getdata触发时)初始化dat2,否则首次渲染plot时dat2()会是NULL,导致报错。 - 修正了变量命名(把maxy/miny改成max_x/min_x,更符合X轴的语义),避免混淆。
现在运行代码,双击绘图区域时:
- 如果之前有刷选X轴范围,会自动过滤数据并重新调整Y轴范围
- 如果没有刷选,会恢复显示全部数据
内容的提问来源于stack exchange,提问作者hjw
相关产品推荐
相关产品推荐

