闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入
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*
函数在外部使用它。 (没有“模块方法”也可以,但是代码有点乱)
为了在我的示例中清晰起见,我尝试在 textOutput
和 renderText
中使用纬度和经度,而不是在模块中。
# 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()
。一般来说,output
s不应该在observe()
或者observeEvent()
里面赋值
【讨论】:
谢谢Gregor,这正是我需要的,我也使用了leafletProxy,它使用起来更快更好,很好的提示,谢谢!以上是关于闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入的主要内容,如果未能解决你的问题,请参考以下文章