【问题标题】:Change easyButton State Within Server Function in R Shiny App在 R Shiny App 的服务器函数中更改 easyButton 状态
【发布时间】:2020-12-05 15:36:04
【问题描述】:

有谁知道在 R Shiny 应用程序的服务器函数中更改 easyButton 状态的方法?

leaflet() %>%
    setView(lng = -70.4803, lat = 40.94404, zoom = 6) %>%
    addProviderTiles('Esri.WorldImagery') %>%
    addEasyButton(
    easyButton(id = 'edit-btn', states = list(
      easyButtonState( 
        stateName = 'add-toolbar',
        icon = icon('toggle-off'),
        title = 'Edit',
        onClick = JS("
          function(btn, map) {
            Shiny.onInputChange('edit_btn', 'TRUE');
            btn.state('remove-toolbar');
          }"
        )
      ),
      easyButtonState(
        stateName = 'remove-toolbar',
        icon = icon('toggle-on'),
        title = 'Editing',
        onClick = JS("
          function(btn, map) {
            Shiny.onInputChange('edit_btn', 'FALSE');
            btn.state('add-toolbar');
          }"
        )
      ))
    )
)

然后我尝试在单击另一个操作按钮时触发的服务器函数中更改此 easyButton 的状态:

runjs("edit-btn.state('add-toolbar');")

但这似乎不起作用。

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    您可以使用 shinyjs click() 函数来做到这一点。这是一个可重现的示例:

    library(shiny)
    library(shinyjs)
    ui <- fluidPage(
      useShinyjs(),
      actionButton("toggle_button","My Button"),
      actionButton("disable_button","Toggle State"),
      leafletOutput("my_map")
    )
    
    server <- function(input, output, session) {
      
      observeEvent(input$toggle_button,{
        shinyjs::click("edit-btn")
      })
      
      observeEvent(input$disable_button,({
        shinyjs::toggleState("edit-btn")
      }))
      
      output$my_map <- renderLeaflet({
        leaflet() %>%
          setView(lng = -70.4803, lat = 40.94404, zoom = 6) %>%
          addProviderTiles('Esri.WorldImagery') %>%
          addEasyButton(
            easyButton(id = 'edit-btn', 
                       states = list(
                         easyButtonState( 
                           stateName = 'add-toolbar',
                           icon = icon('toggle-off'),
                           title = 'Edit',
                           onClick = JS("
              function(btn, map) {
                Shiny.onInputChange('edit_btn', 'TRUE');
                btn.state('remove-toolbar');
              }"
                           )
                         ),
                         easyButtonState(
                           stateName = 'remove-toolbar',
                           icon = icon('toggle-on'),
                           title = 'Editing',
                           onClick = JS("
              function(btn, map) {
                Shiny.onInputChange('edit_btn', 'FALSE');
                btn.state('add-toolbar');
              }"
                           )
                         ))
            )
          )
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 知道如何在渲染传单地图后禁用easyButton(页面加载后的秒数)?我在htmlwidgets中使用%&gt;% onRender("$('#crop-btn').disable();")尝试了onRender函数,但没有成功。
    • 您可以使用 shinyjs::toggleState 或 shinyjs::disable。用一个例子编辑了上面的代码。
    • 谢谢@sada93,有帮助!但我希望在传单地图呈现之后以及用户有时间与 UI 交互之前禁用 easyButton。有什么想法吗?
    • 也试过这个,但没有运气%&gt;% onRender("function(el, x, data){var m = this; const elem = document.getElementById('crop-btn'); m.whenReady(function(){elem.disable();});")
    猜你喜欢
    • 1970-01-01
    • 2018-02-09
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2018-07-17
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多