我有一个闪亮的应用程序,我有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将解决我的问题。
提前感谢您的帮助!
答案 0 :(得分:1)
您可以简单地将reactiveValue
作为中间变量引入:
input$timeline_selected
NULL
input$filter
的值更改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
请注意,我不熟悉的软件包中可能有一个更简单的解决方案。