簡體   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