闪亮的 observeEvent 复制输出
Shiny observeEvent duplicating output
我正在尝试将全日历 html 小部件构建到我闪亮的应用程序中。但是,当我尝试过滤掉底层数据框(带有事件)并使用 observeEvent 再次输出日历时,日历会堆积在主面板中 - example 。我怎样才能让旧的过滤器版本消失而只保留当前版本?
server.R
library(fullcalendar)
library(shiny)
server <- function(input, output) {
df<-data.frame(title = paste("Event", 1:3),
start = c("2017-03-01", "2017-11-15", "2017-11-16"),
end = c("2017-03-02", "2017-11-17", "2017-11-16"))
observeEvent(input$typeInput, {
df$title<-as.character(df$title)
df<-df[df$title %in% input$typeInput,]
f<- fullcalendar(data=df)
output$calendar<-htmlwidgets::shinyRenderWidget(f, fullcalendarOutput,
env=parent.frame(), quoted = TRUE)
#output$calendar<-fullcalendar::renderFullcalendar(f)
})
}
ui.R
library(shiny)
library(fullcalendar)
ui <- fluidPage(
shinyjs::useShinyjs(),
titlePanel("Test"),
sidebarLayout(
sidebarPanel(
radioButtons("typeInput", "Product type",
choices = c("Event 3", "Event 2"),
selected = "Event 3")),
mainPanel(
fullcalendarOutput("calendar")
)
)
)
编辑:
我调查了更多(闪亮形式的网络检查),似乎随着每个按钮的更改,都会创建一个 html 小部件的新子项(screenshot)。我认为每次观察到的变化都会重新创建小部件(因为观察事件是重新 运行),但事实并非如此。这是默认行为还是也可能与某些 .js/.css 文件有关?我可以删除小部件并在观察事件部分重新创建它吗?
您想使用 reactive
而不是 observeEvent。此外,您不需要或不想将对输出变量的分配放在观察或反应函数中。
library(fullcalendar)
library(shiny)
server <- function(input, output) {
df <- reactive({
data.frame(title = paste("Event", 1:3), start = c("2017-03-01", "2017-11-15", "2017-11-16"), end = c("2017-03-02", "2017-11-17", "2017-11-16"))
})
f <- reactive({
df <- df()
df$title<-as.character(df$title)
df<-df[df$title %in% input$typeInput,]
fullcalendar(data=df)
})
output$calendar<-htmlwidgets::shinyRenderWidget(f(), fullcalendarOutput, env=parent.frame(), quoted = TRUE)
output$calendar<-fullcalendar::renderFullcalendar(f())
}
我正在尝试将全日历 html 小部件构建到我闪亮的应用程序中。但是,当我尝试过滤掉底层数据框(带有事件)并使用 observeEvent 再次输出日历时,日历会堆积在主面板中 - example 。我怎样才能让旧的过滤器版本消失而只保留当前版本?
server.R
library(fullcalendar)
library(shiny)
server <- function(input, output) {
df<-data.frame(title = paste("Event", 1:3),
start = c("2017-03-01", "2017-11-15", "2017-11-16"),
end = c("2017-03-02", "2017-11-17", "2017-11-16"))
observeEvent(input$typeInput, {
df$title<-as.character(df$title)
df<-df[df$title %in% input$typeInput,]
f<- fullcalendar(data=df)
output$calendar<-htmlwidgets::shinyRenderWidget(f, fullcalendarOutput,
env=parent.frame(), quoted = TRUE)
#output$calendar<-fullcalendar::renderFullcalendar(f)
})
}
ui.R
library(shiny)
library(fullcalendar)
ui <- fluidPage(
shinyjs::useShinyjs(),
titlePanel("Test"),
sidebarLayout(
sidebarPanel(
radioButtons("typeInput", "Product type",
choices = c("Event 3", "Event 2"),
selected = "Event 3")),
mainPanel(
fullcalendarOutput("calendar")
)
)
)
编辑: 我调查了更多(闪亮形式的网络检查),似乎随着每个按钮的更改,都会创建一个 html 小部件的新子项(screenshot)。我认为每次观察到的变化都会重新创建小部件(因为观察事件是重新 运行),但事实并非如此。这是默认行为还是也可能与某些 .js/.css 文件有关?我可以删除小部件并在观察事件部分重新创建它吗?
您想使用 reactive
而不是 observeEvent。此外,您不需要或不想将对输出变量的分配放在观察或反应函数中。
library(fullcalendar)
library(shiny)
server <- function(input, output) {
df <- reactive({
data.frame(title = paste("Event", 1:3), start = c("2017-03-01", "2017-11-15", "2017-11-16"), end = c("2017-03-02", "2017-11-17", "2017-11-16"))
})
f <- reactive({
df <- df()
df$title<-as.character(df$title)
df<-df[df$title %in% input$typeInput,]
fullcalendar(data=df)
})
output$calendar<-htmlwidgets::shinyRenderWidget(f(), fullcalendarOutput, env=parent.frame(), quoted = TRUE)
output$calendar<-fullcalendar::renderFullcalendar(f())
}