闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入

Posted

技术标签:

【中文标题】闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入【英文标题】:Shiny app module: Extract an input created in server function with leaflet 【发布时间】:2021-12-20 04:45:00 【问题描述】:

这是我第一次尝试将闪亮的应用重新组织成闪亮的模块,因此,欢迎提供一些帮助。

我的目标是创建一个带有leaflet 的可点击地图模块,它将纬度和经度存储在input 中,我可以在其他模块中重复使用。目前,该模块通过在ui 中创建leafletOutput (id="mymap") 并在server 函数中使用observeEvent 函数来对点击地图作出反应。点击事件会生成一个经纬度的input 向量(input$input$mymap_click$lat[1] & input$mymap_click$lng[1]),用于在地图上放置一个标记。但是我很难将它们提取为值,以便其他模块或render* 函数在外部使用它。 (没有“模块方法”也可以,但是代码有点乱)

为了在我的示例中清晰起见,我尝试在 textOutputrenderText 中使用纬度和经度,而不是在模块中。

# clickable leaflet module ----------------------------------------------------------

## loads leaflet library

library(leaflet)

##ui function

clicMapOutput <- function(id) 
  ns <- NS(id)
  
  tagList(leafletOutput(ns("mymap")),
          textOutput(ns("text")))


## serverfunction

clicMapServer <- function(id) 
  moduleServer(id,
               function(input, output, session) 
                 # outputs a map
                 output$mymap <-
                   leaflet::renderLeaflet(
                     leaflet() %>% addTiles() %>% setView(lat = 0,
                                                          lng = 0,
                                                          zoom = 2)
                   )
                 
                 # makes map clickable to obtain a marker and a longitude + latitude vector
                 observeEvent(input$mymap_click, 
                   output$mymap <-
                     leaflet::renderLeaflet(
                       leaflet() %>% addTiles() %>% addMarkers(lat = input$mymap_click$lat[1],
                                                               lng = input$mymap_click$lng[1])
                     )
                 )
                 
               )




# Calling modules ---------------------------------------------------------

library(shiny)

ui<-fluidPage(
   clicMapOutput("map"),
textOutput("lng")
)

server<-function(input,output,session)
  
  clicMapServer("map")
  
  output$lng<-renderText(
    input$mymap_click$lng[1]
  )
  



shinyApp(ui=ui,server=server)

【问题讨论】:

我可以为您提供一些链接,您可以在其中阅读有关将参数从一个模块传递到另一个模块的信息。抱歉,如果你认识他们并且仍然需要帮助,但我现在只能这样做:shiny.rstudio.com/articles/modules.htmlmastering-shiny.org/scaling-modules.html#inputs-and-outputsengineering-shiny.org/… 【参考方案1】:

通常的做法是在模块的服务器部分定义一个返回值,然后在模块消费者中使用它

## module server
clicMapServer <- function(id) 
  moduleServer(id, function(input, output, session) 
    ## ...
    return(reactive(input$mymap_click$lng[1])))
  


## consumer server
server <- function(input, output, session) 
  lng <- clicMapServer("map")
  output$lng <- renderText( lng() )

您应该始终确保使用响应式封装返回值,并像使用函数一样使用返回值。如果您想返回多个变量,请参阅我对this question 的回复了解详情。

library(leaflet)
library(shiny)

## module ui
clicMapOutput <- function(id) 
  ns <- NS(id)
  leafletOutput(ns("mymap"))


## module server
clicMapServer <- function(id) 
  moduleServer(id, function(input, output, session) 
    output$mymap <- renderLeaflet(
        leaflet() %>% addTiles() %>% setView(
           lat = 0, lng = 0, zoom = 2)
    )
    
    # handle click events
    observeEvent(input$mymap_click, 
      output$mymap <- renderLeaflet(
        leaflet() %>% addTiles() %>% addMarkers(
          lat = input$mymap_click$lat[1],
          lng = input$mymap_click$lng[1])
      )
    )

    return(reactive(input$mymap_click$lng[1]))
  )


# main ui
ui <- fluidPage(
  clicMapOutput("map"),
  textOutput("lng")
)

# main server
server <- function(input, output, session) 
  lng <- clicMapServer("map")
  output$lng <- renderText( lng() )


shinyApp(ui = ui, server = server)

我注意到的另一件事是您正在通过覆盖output$mymap 来更新传单小部件。最好改用leaflet::leafletProxy()。一般来说,outputs不应该在observe()或者observeEvent()里面赋值

【讨论】:

谢谢Gregor,这正是我需要的,我也使用了leafletProxy,它使用起来更快更好,很好的提示,谢谢!

以上是关于闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入的主要内容,如果未能解决你的问题,请参考以下文章

r - 空文本输入()导致传单闪亮应用程序中的错误

Reactive fileInput()带有Leaflet的闪亮应用程序

如何在闪亮的 R 应用程序中使用传单添加控制输入?

带有闪亮的传单 - 如何确保为用户提供最大的放大选项

使用动态菜单时,闪亮的传单无法正常工作

如何使用 Shinyauthr 库在闪亮中创建登录而不在 R 中显示主面板?