R Shiny中tag$button添加图标及mutate与lapply差异问题
Reactable表格按钮问题解决:图标显示与mutate/lapply差异
一、按钮图标无法显示的修复
你用htmltools::tags$button时错误使用了icon参数——原生HTML按钮标签并没有这个参数,这是Shiny的actionButton专属参数。正确的做法是把icon()生成的图标对象作为按钮的子元素直接插入:
buttonOpenURL <- function(X) { as.character(htmltools::tags$div( htmltools::tags$button( shiny::icon("download"), # 将图标作为按钮内容的一部分 onClick = sprintf("window.open('%s', '_blank')", X) ) )) }
Shiny默认会加载Font Awesome图标库,无需额外引入,修改后图标即可正常渲染。
二、mutate生成按钮列无效的原因及解决
mutate默认按向量整体处理数据,而你的buttonOpenURL函数是为单个URL设计的,直接在mutate里调用会把整个URL向量传给函数,导致生成的HTML代码错误。而lapply是对向量的每个元素逐个调用函数,自然能生成正确结果。
有两种方法让mutate也能正常工作:
方法1:用rowwise逐行处理
通过rowwise()让mutate对每一行单独执行函数:
DF = data.frame(Targets = letters[1:4]) %>% mutate(Download = createLink(Targets)) %>% rowwise() %>% mutate(Download = buttonOpenURL(Download)) %>% ungroup()
方法2:用purrr::map_vec向量化映射
借助purrr包的map_vec函数,直接对向量每个元素应用函数并返回字符向量:
DF = data.frame(Targets = letters[1:4]) %>% mutate(Download = createLink(Targets) %>% purrr::map_vec(buttonOpenURL))
完整修正代码
library(shiny) library(tidyverse) library(reactable) # Functions & Data createLink = function(X) { glue::glue("https://en.wikipedia.org/wiki/{X}") } buttonOpenURL <- function(X) { as.character(htmltools::tags$div( htmltools::tags$button( shiny::icon("download"), onClick = sprintf("window.open('%s', '_blank')", X) ) )) } # UI ui <- fluidPage( reactable::reactableOutput("Table") ) # Server server <- function(input, output, session) { # 用rowwise方式生成按钮列 DF = data.frame(Targets = letters[1:4]) %>% mutate(Download = createLink(Targets)) %>% rowwise() %>% mutate(Download = buttonOpenURL(Download)) %>% ungroup() output$Table <- reactable::renderReactable( reactable::reactable( DF, columns = list( Download = reactable::colDef(sortable = FALSE, html = TRUE) ) ) ) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Curtis
相关产品推荐
相关产品推荐

