Shiny模块报错:无法将closure类型转为character向量
问题排查与解决方案
你遇到的cannot coerce type 'closure' to vector of type 'character'报错,是由多个代码细节问题导致的,以下是逐个修正方案:
1. 模块调用的ID参数错误
在server中调用mapServer(id, data = map_pw())时,第一个参数误用了Shiny内置的id函数(closure类型),但模块server要求传入字符串类型的ID,也就是你UI中mapUI("map")对应的"map"。
2. 响应式对象传递方式错误
传递响应式数据给模块时,要传递响应式对象本身(如map_pw),而非执行它的结果(map_pw())。模块内部需要通过data()获取最新值,只有传递对象才能让模块感知数据变化。
3. 响应式定义顺序问题
map_pw依赖filt_data,mapServer又依赖map_pw,因此必须先定义filt_data和map_pw,再调用mapServer,否则会出现对象未定义的问题。
4. 笔误与地图弹窗语法错误
map_pw中的left_join(filt_pw())是笔误,应改为left_join(filt_data())(你定义的响应式变量是filt_data);- 模块中
addPolygons(popup = ~data()$popup_content)语法冗余,管道中已经是data()的结果,直接用~popup_content即可。
修正后的完整代码
地图模块代码
mapUI <- function(id) { ns <- NS(id) leafletOutput(ns("map")) } mapServer <- function(id, data) { moduleServer(id, function(input, output, session) { output$map <- renderLeaflet({ data() %>% leaflet() %>% addPolygons(popup = ~popup_content) # 直接引用数据列名 }) }) }
应用代码
library(shiny) library(tidyverse) library(leaflet) # 补充加载leaflet包 # 补充缺失的选项定义(根据你的实际数据调整) choices_map_type <- c("A", "B", "C") ui = fluidPage( fluidRow( selectInput(inputId = "media", choices = choices_map_type, label = "Select media to display", selected = "A", multiple = F), mapUI("map") ) ) server <- function(input, output, session) { data <- read_csv("whatever.csv") states <- read_rds("states_sf.rds") # US states shapefile # 1. 定义筛选后的响应式数据 filt_data <- reactive({ data %>% filter(media == input$media) }) # 2. 定义关联后的地图响应式数据 map_pw <- reactive({ states %>% left_join(filt_data()) # 修正笔误 }) # 3. 调用模块server,传入正确参数 mapServer("map", data = map_pw) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者jzadra
相关产品推荐
相关产品推荐

