在sapply中嵌入HTML生成内容时触发handler未注册报错,如何解决?
问题原因
htmltools::HTML()返回的是shiny.tag类的S3对象,不属于R基础的原子数据类型(字符/数值等),直接赋值给数据框的普通向量列时,会保留对象的内部属性,Shiny在解析输出值时无法识别该类型结构,触发无对应handler的报错。你看到报错信息中出现半截的HTML样式代码,就是对象结构破坏后序列化异常导致的。sapply函数默认会对返回结果做自动简化,将多个shiny.tag对象拼接为非预期的数组结构,进一步破坏了HTML对象的正常结构。
解决方案
- 先将数据框的目标列转为列表列,用于存储非原子类型的HTML对象
- 用
lapply替代sapply,保证返回结果是列表结构,每个元素单独保留完整的shiny.tag属性
修正后的代码如下:
# 先将目标列转为列表列 data$new <- as.list(data$new) inds <- which(data$col1 == "Y") data$new[inds] <- lapply(data$new[inds], function(x) { htmltools::HTML( '<span>',x,'</span>', '<span style=\'background :green;font-weight:bold; padding:1px 5px; color : white\'>R</span>' ) })
补充注意点
- 如果你要在Shiny的表格(如DT)、UI输出中渲染该列内容,需要对应开启HTML渲染开关:使用DT时设置
datatable(data, escape = FALSE),使用renderUI渲染时直接传入即可,无需额外转换。
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

