在 shiny 中使用反应式应用程序重置输入
Reset inputs with reactive app in shiny
我想添加一个操作按钮来重置我的输入。
例如这里,我想要所有输入 "All name" "All gender" 和 "All age" ...
我试过 shinyjs 但不幸的是没有用
任何帮助将不胜感激
l <- NULL
l$name <- c('b','e','d','b','b','d','e','e','b','b')
l$age <- c(20,20,21,21,20,22,22,30,21,32)
l$gender <- c('Female', 'Female', 'Male', 'Female', 'Male','Male',
'Female','Male',"Female","Male")
l <- as.data.frame(l)
l$name <- as.character(l$name)
l$age <- as.numeric(l$age)
l$gender <- as.character(l$gender)
library(shiny)
server <- shinyServer(function(input,output){
observeEvent(input$reset, {
reset("Box1")
reset("Box2")
reset("Box3")
})
# DEfinition of all values of my variables
assign('All Names',unique(sort(l$name)))
assign("All Ages", unique(sort(l$age)))
assign('All Genders', unique(sort(l$gender)))
data1 <- reactive({
l[which(l$name %in% if(exists(input$name))
{get(input$name)}else{input$name}),]
})
data2 <- reactive(data1()[which(data1()$age %in% if(exists(input$age))
{get(input$age)}else{input$age}),])
data3 <- eventReactive(input$baba, {
data2()[which(data2()$gender %in% if(exists(input$gender))
{get(input$gender)}else{input$gender}),]
})
output$table3 <- renderTable({
data3()
})
output$Box1 = renderUI(
if((is.null(input$age)) & (is.null(input$gender))){
selectInput("name", "Choose Name", choices=c("All Names",unique(sort(l$name))), selected = input$name)
} else{selectInput("name", "Choose Name", choices=c("All Names",
unique(l[l$gender %in% (if(exists(input$gender)){
get(input$gender)
}else{
input$gender}) &
l$age %in% (if(exists(input$age)){
get(input$age)
}else{input$age}), "name"])), selected = input$name)
}
)
output$Box2 = renderUI(
if((is.null(input$name)) & (is.null(input$gender))){
selectInput("age", "Choose Age", choices=c("All Ages", unique(sort(l$age))), selected = input$age)
}else{selectInput("age", "Choose Age", choices=c("All Ages",unique(l[l$gender %in% (if(exists(input$gender)){get(input$gender)}else{input$gender}) & l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) , "age"])), selected = input$age)}
)
output$Box3 = renderUI(
if((is.null(input$name)) & (is.null(input$age))){
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(sort(l$gender))), selected = input$gender)
}else{
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(l[l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) & l$age %in% (if(exists(input$age)){get(input$age)}else{input$age}), "gender"])), selected = input$gender)
}
)
})
ui <-shinyUI(fluidPage(
useShinyjs(),
uiOutput("Box1"),
uiOutput("Box2"),
uiOutput("Box3"),
actionButton("baba", "GO !"),
actionButton("reset", "reset"),
tableOutput("table3")
))
shinyApp(ui,server)
................................................ ..................................................... ...................................................
这是适合您的代码:
l <- NULL
l$name <- c('b','e','d','b','b','d','e','e','b','b')
l$age <- c(20,20,21,21,20,22,22,30,21,32)
l$gender <- c('Female', 'Female', 'Male', 'Female', 'Male','Male',
'Female','Male',"Female","Male")
l <- as.data.frame(l)
l$name <- as.character(l$name)
l$age <- as.numeric(l$age)
l$gender <- as.character(l$gender)
library(shiny)
library(shinyjs)
server <- shinyServer(function(input,output){
observeEvent(input$reset, {
shinyjs::reset("name")
shinyjs::reset("age")
shinyjs::reset("gender")
})
# DEfinition of all values of my variables
assign('All Names',unique(sort(l$name)))
assign("All Ages", unique(sort(l$age)))
assign('All Genders', unique(sort(l$gender)))
data1 <- reactive({
l[which(l$name %in% if(exists(input$name))
{get(input$name)}else{input$name}),]
})
data2 <- reactive(data1()[which(data1()$age %in% if(exists(input$age))
{get(input$age)}else{input$age}),])
data3 <- eventReactive(input$baba, {
data2()[which(data2()$gender %in% if(exists(input$gender))
{get(input$gender)}else{input$gender}),]
})
output$table3 <- renderTable({
data3()
})
output$Box1 = renderUI(
if((is.null(input$age)) & (is.null(input$gender))){
selectInput("name", "Choose Name", choices=c("All Names",unique(sort(l$name))), selected = "All Names")
} else{selectInput("name", "Choose Name", choices=c("All Names",
unique(l[l$gender %in% (if(exists(input$gender)){
get(input$gender)
}else{
input$gender}) &
l$age %in% (if(exists(input$age)){
get(input$age)
}else{input$age}), "name"])), selected = "All Names")
}
)
output$Box2 = renderUI(
if((is.null(input$name)) & (is.null(input$gender))){
selectInput("age", "Choose Age", choices=c("All Ages", unique(sort(l$age))), selected = "All Ages")
}else{selectInput("age", "Choose Age", choices=c("All Ages",unique(l[l$gender %in% (if(exists(input$gender)){get(input$gender)}else{input$gender}) & l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) , "age"])), selected = "All Ages")}
)
output$Box3 = renderUI(
if((is.null(input$name)) & (is.null(input$age))){
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(sort(l$gender))), selected = "All Genders")
}else{
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(l[l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) & l$age %in% (if(exists(input$age)){get(input$age)}else{input$age}), "gender"])), selected = "All Genders")
}
)
})
ui <-shinyUI(fluidPage(
useShinyjs(),
uiOutput("Box1"),
uiOutput("Box2"),
uiOutput("Box3"),
actionButton("baba", "GO !"),
actionButton("reset", "reset"),
tableOutput("table3")
))
shinyApp(ui,server)
有两件事造成了问题,不是包 shinyjs
,而是您的代码:
1. 您在小部件中没有 selected
值,例如您有:selected = input$age
但没有固定值重置为 (我已将其更改为 selected = "All ages"
,等等)
2. 您应该将 shinyjs::reset()
函数与小部件的 id 一起使用,例如您的情况:名称,年龄和性别,而不是你有:Box1,Box2,Box3
我想添加一个操作按钮来重置我的输入。 例如这里,我想要所有输入 "All name" "All gender" 和 "All age" ...
我试过 shinyjs 但不幸的是没有用
任何帮助将不胜感激
l <- NULL
l$name <- c('b','e','d','b','b','d','e','e','b','b')
l$age <- c(20,20,21,21,20,22,22,30,21,32)
l$gender <- c('Female', 'Female', 'Male', 'Female', 'Male','Male',
'Female','Male',"Female","Male")
l <- as.data.frame(l)
l$name <- as.character(l$name)
l$age <- as.numeric(l$age)
l$gender <- as.character(l$gender)
library(shiny)
server <- shinyServer(function(input,output){
observeEvent(input$reset, {
reset("Box1")
reset("Box2")
reset("Box3")
})
# DEfinition of all values of my variables
assign('All Names',unique(sort(l$name)))
assign("All Ages", unique(sort(l$age)))
assign('All Genders', unique(sort(l$gender)))
data1 <- reactive({
l[which(l$name %in% if(exists(input$name))
{get(input$name)}else{input$name}),]
})
data2 <- reactive(data1()[which(data1()$age %in% if(exists(input$age))
{get(input$age)}else{input$age}),])
data3 <- eventReactive(input$baba, {
data2()[which(data2()$gender %in% if(exists(input$gender))
{get(input$gender)}else{input$gender}),]
})
output$table3 <- renderTable({
data3()
})
output$Box1 = renderUI(
if((is.null(input$age)) & (is.null(input$gender))){
selectInput("name", "Choose Name", choices=c("All Names",unique(sort(l$name))), selected = input$name)
} else{selectInput("name", "Choose Name", choices=c("All Names",
unique(l[l$gender %in% (if(exists(input$gender)){
get(input$gender)
}else{
input$gender}) &
l$age %in% (if(exists(input$age)){
get(input$age)
}else{input$age}), "name"])), selected = input$name)
}
)
output$Box2 = renderUI(
if((is.null(input$name)) & (is.null(input$gender))){
selectInput("age", "Choose Age", choices=c("All Ages", unique(sort(l$age))), selected = input$age)
}else{selectInput("age", "Choose Age", choices=c("All Ages",unique(l[l$gender %in% (if(exists(input$gender)){get(input$gender)}else{input$gender}) & l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) , "age"])), selected = input$age)}
)
output$Box3 = renderUI(
if((is.null(input$name)) & (is.null(input$age))){
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(sort(l$gender))), selected = input$gender)
}else{
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(l[l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) & l$age %in% (if(exists(input$age)){get(input$age)}else{input$age}), "gender"])), selected = input$gender)
}
)
})
ui <-shinyUI(fluidPage(
useShinyjs(),
uiOutput("Box1"),
uiOutput("Box2"),
uiOutput("Box3"),
actionButton("baba", "GO !"),
actionButton("reset", "reset"),
tableOutput("table3")
))
shinyApp(ui,server)
................................................ ..................................................... ...................................................
这是适合您的代码:
l <- NULL
l$name <- c('b','e','d','b','b','d','e','e','b','b')
l$age <- c(20,20,21,21,20,22,22,30,21,32)
l$gender <- c('Female', 'Female', 'Male', 'Female', 'Male','Male',
'Female','Male',"Female","Male")
l <- as.data.frame(l)
l$name <- as.character(l$name)
l$age <- as.numeric(l$age)
l$gender <- as.character(l$gender)
library(shiny)
library(shinyjs)
server <- shinyServer(function(input,output){
observeEvent(input$reset, {
shinyjs::reset("name")
shinyjs::reset("age")
shinyjs::reset("gender")
})
# DEfinition of all values of my variables
assign('All Names',unique(sort(l$name)))
assign("All Ages", unique(sort(l$age)))
assign('All Genders', unique(sort(l$gender)))
data1 <- reactive({
l[which(l$name %in% if(exists(input$name))
{get(input$name)}else{input$name}),]
})
data2 <- reactive(data1()[which(data1()$age %in% if(exists(input$age))
{get(input$age)}else{input$age}),])
data3 <- eventReactive(input$baba, {
data2()[which(data2()$gender %in% if(exists(input$gender))
{get(input$gender)}else{input$gender}),]
})
output$table3 <- renderTable({
data3()
})
output$Box1 = renderUI(
if((is.null(input$age)) & (is.null(input$gender))){
selectInput("name", "Choose Name", choices=c("All Names",unique(sort(l$name))), selected = "All Names")
} else{selectInput("name", "Choose Name", choices=c("All Names",
unique(l[l$gender %in% (if(exists(input$gender)){
get(input$gender)
}else{
input$gender}) &
l$age %in% (if(exists(input$age)){
get(input$age)
}else{input$age}), "name"])), selected = "All Names")
}
)
output$Box2 = renderUI(
if((is.null(input$name)) & (is.null(input$gender))){
selectInput("age", "Choose Age", choices=c("All Ages", unique(sort(l$age))), selected = "All Ages")
}else{selectInput("age", "Choose Age", choices=c("All Ages",unique(l[l$gender %in% (if(exists(input$gender)){get(input$gender)}else{input$gender}) & l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) , "age"])), selected = "All Ages")}
)
output$Box3 = renderUI(
if((is.null(input$name)) & (is.null(input$age))){
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(sort(l$gender))), selected = "All Genders")
}else{
selectInput("gender", "Choose Gender", choices=c("All Genders", unique(l[l$name %in% (if(exists(input$name)){get(input$name)}else{input$name}) & l$age %in% (if(exists(input$age)){get(input$age)}else{input$age}), "gender"])), selected = "All Genders")
}
)
})
ui <-shinyUI(fluidPage(
useShinyjs(),
uiOutput("Box1"),
uiOutput("Box2"),
uiOutput("Box3"),
actionButton("baba", "GO !"),
actionButton("reset", "reset"),
tableOutput("table3")
))
shinyApp(ui,server)
有两件事造成了问题,不是包 shinyjs
,而是您的代码:
1. 您在小部件中没有 selected
值,例如您有:selected = input$age
但没有固定值重置为 (我已将其更改为 selected = "All ages"
,等等)
2. 您应该将 shinyjs::reset()
函数与小部件的 id 一起使用,例如您的情况:名称,年龄和性别,而不是你有:Box1,Box2,Box3