【问题标题】:Modify shiny action button once it is clicked单击后修改闪亮的操作按钮
【发布时间】:2016-02-09 00:12:18
【问题描述】:

我在 server.R 中有以下内容

shinyServer(function(input, output) {

# builds a reactive expression that only invalidates 
# when the value of input$goButton becomes out of date 
# (i.e., when the button is pressed)
ntext <- eventReactive(input$goButton, {
input$n
})

output$nText <- renderText({
ntext()
})
})

以及ui.R中的以下内容

shinyUI(pageWithSidebar(
headerPanel("actionButton test"),
sidebarPanel(
numericInput("n", "N:", min = 0, max = 100, value = 50),
br(),
actionButton("goButton", "Go!"),
p("Click the button to update the value displayed in the main panel.")
),
mainPanel(
verbatimTextOutput("nText")
)
))

我的目标是让 go 动作按钮在点击五次后消失,如果点击少于五次,则会弹出窗口警告。

【问题讨论】:

  • 看看shinyjs,它可以做到这一点(改变按钮上的文字或使其消失)

标签: r shiny shinyjs


【解决方案1】:

正如@daattali 所说,shinyjs 让这变得非常简单,你可以这样做:

library(shiny)
library(shinyjs)

ui <- shinyUI(
  fluidPage(
    useShinyjs(),
    sidebarPanel(
      actionButton('btn','Click me')
    ),
    mainPanel(
      verbatimTextOutput("nText")
    )
  )
)

server <- shinyServer(function(input,output,session){
  n <- 0
  makeReactiveBinding('n')

  observeEvent(input$btn, { 
    if(n < 5){
      info('Msg')
    } else if(n > 5){
      hide('btn')
    }
    n <<- n + 1 
  })

  output$nText <- renderText({
    n
  })

})

shinyApp(ui=ui,server=server)

以下是在不使用 shinyjs 的情况下隐藏按钮的方法:

library(shiny)

ui <- shinyUI(
  fluidPage(
    tags$head(
      tags$style(
        HTML('#num{display: none;}')
      )
    ),
    useShinyjs(),
    sidebarPanel(
      conditionalPanel(
        condition = "input.num < 5",
        actionButton('btn','Click me')
      ),
      numericInput('num','',0)
    ),
    mainPanel(
      verbatimTextOutput("nText")
    )
  )
)

server <- shinyServer(function(input,output,session){
  n <- 0
  makeReactiveBinding('n')

  observeEvent(input$btn, { 
    n <<- n + 1
    updateNumericInput(session,'num',value=n)
  })

  output$nText <- renderText({
    n
  })

})

shinyApp(ui=ui,server=server)

最后不用observeEvent:

library(shiny)

ui <- shinyUI(
  fluidPage(
    tags$head(
      tags$style(
        HTML('#num{display: none;}')
      )
    ),
    useShinyjs(),
    sidebarPanel(
      conditionalPanel(
        condition = "input.num < 5",
        actionButton('btn','Click me')
      ),
      numericInput('num','',0)
    ),
    mainPanel(
      verbatimTextOutput("nText")
    )
  )
)

server <- shinyServer(function(input,output,session){
  n <- 0
  makeReactiveBinding('n')

  observe({
    input$btn
    isolate({
      n <<- n + 1
      updateNumericInput(session,'num',value=n)
    })
  })

  output$nText <- renderText({
    n
  })

})

shinyApp(ui=ui,server=server)

【讨论】:

  • 没有shinyjs有没有办法隐藏它?我一直在尝试隐藏单击按钮后放置的 div,但这不会强制显示任何内容。这是为什么呢?
  • 是的,shinyjs 基本上所做的就是调用 javascript,因此您可以随时自己编写,否则您可以使用 CSS 和 conditionalPanel,但我确实认为 shinyjs 是最好的选择。
  • 感谢您的回复。找不到函数 observeEvent 是我得到的。
  • 你可能有一个旧版本的闪亮,尝试更新,否则使用observe代替
  • 你有什么办法可以通过观察提供解决方案吗?我一直在努力使它工作,因为我不断收到错误。如果你愿意,我可以提出一个新问题,这样我可以再给你一点。谢谢。
【解决方案2】:

您无需定义反应式n。已经是input$btn的值了。

library(shiny)
library(shinyjs)

ui <- shinyUI(
  fluidPage(
    useShinyjs(),
    sidebarPanel(
      actionButton('btn','Click me')
    ),
    mainPanel(
      verbatimTextOutput("nText")
    )
  )
)

server <- shinyServer(function(input,output,session){

  observe({ 
    if(input$btn < 5){
      info('Msg')
    } else {
      hide('btn')
    }
  })

  output$nText <- renderText({
    input$btn
  })

})

shinyApp(ui=ui,server=server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2018-10-09
    • 2016-11-16
    • 2017-10-12
    • 1970-01-01
    • 2015-12-12
    • 2023-01-14
    • 2019-03-16
    相关资源
    最近更新 更多