Enable/disable 使用响应式表达式的按钮
Enable/disable a button using a reactive expression
我正在开发一个闪亮的应用程序。我要求用户首先选择 he/she 想要如何上传数据,通过文件或选择环境变量,使用单选按钮。
一旦 selected,根据这个选择,用户可以上传文件或 select 变量。
我有一个按钮可以让应用程序根据用户提供的数据计算绘图。
我希望在提供数据之前禁用该按钮,但是我无法根据存储用户数据的反应表达式的存在使 shinyjs 启用该按钮。
这是一个例子:
library(shiny)
shinyApp(
ui = fluidPage(
useShinyjs(),
radioButtons("dataSourceType", "Select data source:",
c("From file" = "file",
"From workspace" = "var")),
conditionalPanel(
condition = "input.dataSourceType == 'file'",
fileInput("dataFile", "Choose data file:")
),
conditionalPanel(
condition = "input.dataSourceType == 'var'",
selectInput("dataVar", "Choose data var:",
ls(envir=.GlobalEnv))
),
disable(actionButton("btn", "Click me")),
textOutput("text")
),
server = function(input, output) {
data <- reactive({
if(input$dataSourceType=="file"){
req(input$dataSourceType)
return(read.csv(file=input$dataFile$datapath))
} else {
req(input$dataVar)
get(input$dataVar)
}
})
observe({
if(isTruthy(data())){
enable("btn")
} else {
disable("btn")
}
})
observeEvent(input$btn, {
output$text <- renderText({
head(as.character(data()))
})
})
}
)
要禁用该按钮,当 input$dataFile
中未提供用户文件时,您需要确保 return data()
的 NULL
值。试试这个
library(shiny)
library(shinyjs)
library(DT)
shinyApp(
ui = fluidPage(
useShinyjs(),
sidebarLayout(
sidebarPanel(
radioButtons("dataSourceType", "Select data source:",
c("From file" = "file",
"From workspace" = "var")),
conditionalPanel(
condition = "input.dataSourceType = 'file'",
fileInput("dataFile", "Choose data file:")
),
conditionalPanel(
condition = "input.dataSourceType = 'var'",
selectInput("dataVar", "Choose data var:",
ls(envir=.GlobalEnv))
),
actionButton("btn", "Click me")
),
mainPanel(
DTOutput("t1")
#, textOutput("text")
)
)
),
server = function(input, output,session) {
data <- reactive({
req(input$dataSourceType)
if(input$dataSourceType=="file"){
if (is.null(input$dataFile)) {return(NULL)
}else return(read.csv(file=input$dataFile$datapath, header=TRUE, sep=","))
} else {
req(input$dataVar)
get(input$dataVar)
}
})
observe({
if(!is.null(data())){
shinyjs::enable("btn")
}else {
shinyjs::disable("btn")
}
})
observeEvent(input$btn, {
req(data())
output$text <- renderText({
head(as.character(data()))
})
output$t1 <- renderDT(data())
})
}
)
我正在开发一个闪亮的应用程序。我要求用户首先选择 he/she 想要如何上传数据,通过文件或选择环境变量,使用单选按钮。
一旦 selected,根据这个选择,用户可以上传文件或 select 变量。
我有一个按钮可以让应用程序根据用户提供的数据计算绘图。
我希望在提供数据之前禁用该按钮,但是我无法根据存储用户数据的反应表达式的存在使 shinyjs 启用该按钮。
这是一个例子:
library(shiny)
shinyApp(
ui = fluidPage(
useShinyjs(),
radioButtons("dataSourceType", "Select data source:",
c("From file" = "file",
"From workspace" = "var")),
conditionalPanel(
condition = "input.dataSourceType == 'file'",
fileInput("dataFile", "Choose data file:")
),
conditionalPanel(
condition = "input.dataSourceType == 'var'",
selectInput("dataVar", "Choose data var:",
ls(envir=.GlobalEnv))
),
disable(actionButton("btn", "Click me")),
textOutput("text")
),
server = function(input, output) {
data <- reactive({
if(input$dataSourceType=="file"){
req(input$dataSourceType)
return(read.csv(file=input$dataFile$datapath))
} else {
req(input$dataVar)
get(input$dataVar)
}
})
observe({
if(isTruthy(data())){
enable("btn")
} else {
disable("btn")
}
})
observeEvent(input$btn, {
output$text <- renderText({
head(as.character(data()))
})
})
}
)
要禁用该按钮,当 input$dataFile
中未提供用户文件时,您需要确保 return data()
的 NULL
值。试试这个
library(shiny)
library(shinyjs)
library(DT)
shinyApp(
ui = fluidPage(
useShinyjs(),
sidebarLayout(
sidebarPanel(
radioButtons("dataSourceType", "Select data source:",
c("From file" = "file",
"From workspace" = "var")),
conditionalPanel(
condition = "input.dataSourceType = 'file'",
fileInput("dataFile", "Choose data file:")
),
conditionalPanel(
condition = "input.dataSourceType = 'var'",
selectInput("dataVar", "Choose data var:",
ls(envir=.GlobalEnv))
),
actionButton("btn", "Click me")
),
mainPanel(
DTOutput("t1")
#, textOutput("text")
)
)
),
server = function(input, output,session) {
data <- reactive({
req(input$dataSourceType)
if(input$dataSourceType=="file"){
if (is.null(input$dataFile)) {return(NULL)
}else return(read.csv(file=input$dataFile$datapath, header=TRUE, sep=","))
} else {
req(input$dataVar)
get(input$dataVar)
}
})
observe({
if(!is.null(data())){
shinyjs::enable("btn")
}else {
shinyjs::disable("btn")
}
})
observeEvent(input$btn, {
req(data())
output$text <- renderText({
head(as.character(data()))
})
output$t1 <- renderDT(data())
})
}
)