当选择不同的过滤器时,将输入$ mytime_selected值重置为timevis中的NULL

时间:2018-03-21 00:11:19

标签: r shiny vis.js

我有一个闪亮的应用程序,我有2个过滤器选择("一个选项"和#34;另一个选项")。时间轴以"选项"开头。选择。如果用户选择时间线中的项目,则会显示一些文本。我想要做的是如果用户在时间轴中选择了某些内容,则将输入$ timeline_selected值设置回NULL,然后在清除选择之前选择不同的过滤器选项。例如,在这个简单的应用程序中,如果用户将过滤器设置为"选项",则选择"第一项"在时间轴上,然后将过滤器更改为"另一个选项"在清除选择之前,"选择ID"即使在更改过滤器时该时间轴上没有显示该项目,该项目仍为1。

我希望发生以下情况:用户将过滤器设置为"选项",然后选择"第一项"在时间轴上,然后将过滤器更改为"另一个选项" (在清除选择之前),输入的$ timeline_selected值将重置为NULL。

library(shiny)
library(dplyr)

dataBasic <- data.frame(
  id = 1:4,
  content = c("Item one", "Item two" ,"Ranged item", "Item four"),
  start   = c("2016-01-10", "2016-01-11", "2016-01-20", "2016-02-14"),
  end    = c(NA, NA, "2016-02-04", NA), 
  selection = c("an option", "an option", "another option", "another option")
)


ui <- fluidPage(
  sidebarPanel(radioButtons(inputId = "filter",
               label = "Select filter:",
               choices = unique(dataBasic$selection),
               selected = "an option")
  ),
  mainPanel(wellPanel(timevisOutput("timeline")
                      ), 
            wellPanel(htmlOutput(outputId = "text"),
                      textOutput("selected", inline = TRUE)
                      )
            )
)

server <- function(input, output){
  # Create timeline
  output$timeline <- renderTimevis({
    req(input$filter)
    dataBasic %>% 
      filter(selection == input$filter) %>% 
      timevis()
  })


  output$text <- renderText({

    if (!is.null(input$timeline_selected)) {
      input$timeline_data %>% 
        filter(id == input$timeline_selected) %>% 
        pull(content)
    }
  })

  output$selected <- renderText(
    paste("selection id: ", input$timeline_selected)
  )

  # clear selection if different filter is chosen
  # observeEvent(input$filter, {
  #    input$timeline_selected <- NULL
  #  })

}
shinyApp(ui = ui, server = server)

我尝试使用

observeEvent(input$filter, {
      input$timeline_selected <- NULL
    })

然后我收到错误声明&#34;尝试为只读反应值对象分配值&#34;

我考虑过使用setSelection,但在输入$ mytime_selected下的timevis帮助中,它表示&#34;请注意,如果使用setSelection以编程方式选择项目,则不会更新。&#34;

我的应用程序比这个例子更复杂,我根据id过滤数据,当我将过滤器从一个选项更改为另一个选项时,它显示错误,因此能够将输入$ timeline_selected值重置为NULL将解决我的问题。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以简单地将reactiveValue作为中间变量引入:

  1. 每当更改input$timeline_selected
  2. 时,取值NULL
  3. input$filter的值更改
  4. 时设置为server

    将以下代码添加到# Define reactiveValue rv <- reactiveValues(selected = NULL) # 1. Pass value of input$timeline_selected to Reactive Value observe( { rv$selected <- input$timeline_selected }) # 2. clear selection if different filter is chosen observeEvent(input$filter, { rv$selected <- NULL }) 函数中:

    input$timeline_selected

    然后将代码中的output$text <- renderText({ if (!is.null(rv$selected)) { input$timeline_data %>% filter(id == rv$selected) %>% pull(content) } }) output$selected <- renderText( paste("selection id: ", rv$selected) ) 更改为无效值:

    spring.datasource.tomcat.testWhileIdle = true
    spring.datasource.tomcat.timeBetweenEvictionRunsMillis = 50000
    spring.datasource.tomcat.validationQuery = SELECT 1
    

    请注意,我不熟悉的软件包中可能有一个更简单的解决方案。