golem应用中点击按钮触发observeEvent无法渲染表格问题求助
Shiny模块无响应问题修复方案
核心问题
Shiny模块要求UI端所有输入、输出组件的id必须绑定模块命名空间(即套ns()函数),你当前代码中的textInput(id为link)、actionButton(id为pesquisar_autores)都没有做命名空间绑定,导致server端的input无法监听到按钮点击事件、也无法获取输入的链接值,这是点击无响应的根本原因。
修复后的完整代码
#' seleciona_autores UI Function #' #' @description A shiny Module. #' #' @param id,input,output,session Internal parameters for {shiny}. #' #' @noRd #' #' @importFrom shiny NS tagList mod_seleciona_autores_ui <- function(id){ ns <- NS(id) tagList( shiny::textInput( ns('link'), # 新增命名空间绑定 label = '谷歌学术个人主页链接', value = '' ), shiny::actionButton( ns('pesquisar_autores'), # 新增命名空间绑定 '查询共同作者' ), tableOutput(ns('lista_parceiros')) ) } #' seleciona_autores Server Functions #' #' @noRd mod_seleciona_autores_server <- function(id){ moduleServer( id, function(input, output, session){ ns <- session$ns # 输出定义移到observeEvent外,符合Shiny最佳实践 output$lista_parceiros <- renderTable({ req(input$pesquisar_autores) # 等待按钮触发 req(input$link) # 校验输入链接非空 # 新增错误捕获,避免爬取失败直接导致模块崩溃 tryCatch({ forecasts <- rvest::read_html(input$link) %>% rvest::html_nodes(".gsc_a_tr") %>% rvest::html_nodes(".gsc_a_t") %>% rvest::html_element("div") %>% rvest::html_text() parceiros <- data.frame(table(trimws(unlist(strsplit(forecasts, ","))))) parceiros <- parceiros[parceiros$Var1 != '...',] parceiros <- parceiros[order(parceiros$Freq, decreasing = TRUE),] colnames(parceiros) <- c('共同作者', '合作成果数量') return(parceiros) }, error = function(e) { return(data.frame(提示 = "爬取失败,请检查链接有效性、网络环境或确认是否触发谷歌学术反爬限制")) }) }) }) }
额外注意事项
- 谷歌学术有反爬机制,高频访问会触发验证码校验,此时爬取逻辑会返回错误,可根据业务需要补充验证处理逻辑
- 调用模块时不要忘记在主UI调用
mod_seleciona_autores_ui("自定义模块id"),在主server调用mod_seleciona_autores_server("自定义模块id"),两侧id必须完全一致
内容的提问来源于stack exchange,提问作者Arã Souza
相关产品推荐
相关产品推荐

