繁体   English   中英

当单击指定输入以外的任何操作或其他按钮时,如何在 R Shiny 中使用 js 隐藏条件面板?

[英]How to hide a conditional panel using js in R Shiny when any action or other button is clicked other than specified inputs?

当除了用户单击操作按钮“删除”或在条件面板中呈现的selectInput() function 中进行选择之外,还有任何用户输入时,我试图隐藏下面所示的条件面板,如下图所示. 将添加其他用户输入(操作按钮、单选按钮、selectInputs 等),因此列出导致条件面板隐藏的每个操作是不可行的。 该条件面板应始终在单击“删除”时呈现。 有关如何执行此操作的任何建议? 代码显示在底部。

在此处输入图像描述

代码:

library(rhandsontable)
library(shiny)

mydata <- data.frame('Col 1' = c(1,24,0,1), check.names = FALSE)
rownames(mydata) <- c('Term A','Term B','Term C','Term D') 

ui <- fluidPage(br(),
      rHandsontableOutput("mytable"),br(),
        fluidRow(
          column(1,actionButton("addCol", "Add",width = '70px')),
          column(1,actionButton("delCol","Delete",width = '70px')),
          column(3,conditionalPanel(condition = "input.delCol",uiOutput("delCol"))) # js here
        )
)

server <- function(input, output) {
  
  output$mytable = renderRHandsontable(df())
  
  df <- eventReactive(input$addCol, {
    if(input$addCol > 0){
      newcol <- data.frame(mydata[,1])
      names(newcol) <- paste("Col",ncol(mydata)+1)
      mydata <<- cbind(mydata, newcol)
    }
    rhandsontable(mydata,rowHeaderWidth = 100, useTypes = TRUE)
  }, ignoreNULL = FALSE)
  
  observeEvent(input$delCol,
    {output$delCol<-renderUI(selectInput("delCol",label=NULL,choices=colnames(mydata),selected="Col 1"))}
    )
  
}

shinyApp(ui,server)

根据 Mike 的评论,我从 shinyjs 和 shinyjs 参考手册中的这个简单示例开始,对 2 个按钮进行了微小的修改:

library(shiny)
library(shinyjs)

ui = fluidPage(
       useShinyjs(), # Set up shinyjs
       actionButton("btn", "Click to show"),
       actionButton("btn1","Click to hide"),
       hidden(p(id = "element", "I was invisible"))
     )

server = function(input, output) {
  observeEvent(input$btn, {show("element")})
  observeEvent(input$btn1,{hide("element")})
  }

shinyApp(ui,server)

然后我按照以下将其扩展到我在 OP 中的代码。 请注意,对于每个触发selectInput()隐藏而不是全局隐藏的用户操作,这仍然需要一个observeEvent()每次除了单击“删除”操作按钮之外的任何用户输入时。 我不确定这是可能的,但会继续研究。 多个observeEvents()在任何情况下都不会是一个太糟糕的选择。

解析代码:

library(rhandsontable)
library(shiny)
library(shinyjs)

mydata <- data.frame('Col 1' = c(1,24,0,1), check.names = FALSE)
rownames(mydata) <- c('Term A','Term B','Term C','Term D') 

ui <- fluidPage(
  useShinyjs(), # set up shinyjs
  br(),
  rHandsontableOutput("mytable"),br(),
  fluidRow(
    column(1,actionButton("addCol", "Add",width = '70px')),
    column(1,actionButton("delCol","Delete",width = '70px')),
    column(3, hidden(uiOutput("delCol2")))) # hide selectInput()
)

server <- function(input,output,session){
  
  output$mytable = renderRHandsontable(dat())
  
  dat <- eventReactive(input$addCol, {
    if(input$addCol > 0){
      newcol <- data.frame(mydata[,1])
      names(newcol) <- paste("Col",ncol(mydata)+1)
      mydata <<- cbind(mydata, newcol)
    }
    rhandsontable(mydata,rowHeaderWidth = 100, useTypes = TRUE)
  }, ignoreNULL = FALSE)
  
  observeEvent(input$delCol, show("delCol2")) # clicking Delete button reveals selectInput()
   
  observeEvent(input$addCol, hide("delCol2")) # clicking Add hides selectInput()
  
  output$delCol2 <-renderUI({
    selectInput(
      "delCol3",
      label=NULL,
      choices=colnames(mydata),
      selected="Col 1"
    )
  })
  
}

shinyApp(ui,server)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM