在R应用程序中更改服务器功能内的easyButton状态

在R应用程序中更改服务器功能内的easyButton状态,r,shiny,leaflet,R,Shiny,Leaflet,有人知道在R应用程序的服务器功能中改变easyButton状态的方法吗 leaflet() %>% setView(lng = -70.4803, lat = 40.94404, zoom = 6) %>% addProviderTiles('Esri.WorldImagery') %>% addEasyButton( easyButton(id = 'edit-btn', states = list( easyButtonState

有人知道在R应用程序的服务器功能中改变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');")

但这似乎不起作用。

您可以使用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)
库(闪亮)
图书馆(shinyjs)
ui%
加法器按钮(
easyButton(id=‘编辑btn’,
状态=列表(
easyButtonState(
stateName='添加工具栏',
图标=图标(“切换关闭”),
标题='编辑',
onClick=JS(“
功能(btn、map){
闪亮的.onInputChange('edit_btn','TRUE');
btn.state('remove-toolbar');
}"
)
),
易按钮状态(
stateName='删除工具栏',
icon=图标(‘打开开关’),
标题='编辑',
onClick=JS(“
功能(btn、map){
闪亮的.onInputChange('edit_btn','FALSE');
btn.状态(“添加工具栏”);
}"
)
))
)
)
})
}
shinyApp(用户界面、服务器)

聪明!成功了,谢谢你的帮助。你知道如何在呈现传单地图后(页面加载后几秒)禁用easyButton吗?我尝试了
htmlwidgets
中的
onRender
函数,使用的是
%>%onRender($('#裁剪btn').disable();”
,但它不起作用。您可以使用shinyjs::toggleState或shinyjs::disable。用一个例子编辑了上面的代码。谢谢@sada93,这很有帮助!但我希望在传单地图渲染之后,在用户有时间与UI交互之前,禁用easyButton。有什么想法吗?在Render(“函数(el,x,data){var m=this;const elem=document.getElementById('crop-btn');m.whenReady(函数(){elem.disable();});”)上也尝试了这一点,但运气不佳。