在R Markdown中用循环生成ggVennDiagram报错的解决求助
问题:R Markdown循环生成ggVennDiagram报错
在R Markdown报告中动态循环生成韦恩图时,使用ggVennDiagram库出现如下错误:
Error in as.vector(x, "character") : cannot coerce type 'environment' to vector of type 'character'
相关代码:
listToPlot <- list( x = unique(round(100*runif(100))), y = unique(round(100*runif(100))), z = unique(round(100*runif(100))), q = unique(round(100*runif(100))) ) l <- htmltools::tagList() if(length(listToPlot) > 3){ for(i in c(2:length(listToPlot))){ l[[i-1]] <- ggVennDiagram::ggVennDiagram(listToPlot[c(1,i)]) } }else{ if(length(listToPlot) > 1){ l[[1]] <- ggVennDiagram::ggVennDiagram(listToPlot) } } l
解决方案
报错核心原因是htmltools::tagList()仅支持HTML标签或htmlwidget类型对象(比如plotly),但ggVennDiagram返回的是ggplot对象,直接存入tagList会触发类型转换错误。以下是两种可行解决方法:
方法1:直接循环print ggplot对象
R Markdown中可直接在循环内调用print()渲染ggplot对象,无需借助tagList:
listToPlot <- list( x = unique(round(100*runif(100))), y = unique(round(100*runif(100))), z = unique(round(100*runif(100))), q = unique(round(100*runif(100))) ) if(length(listToPlot) > 3){ for(i in c(2:length(listToPlot))){ p <- ggVennDiagram::ggVennDiagram(listToPlot[c(1,i)]) print(p) } }else{ if(length(listToPlot) > 1){ p <- ggVennDiagram::ggVennDiagram(listToPlot) print(p) } }
方法2:将ggplot转为plotly对象存入tagList
如果需要用tagList统一管理图表,可通过plotly::ggplotly()把ggplot对象转成htmlwidget类型的plotly对象,让tagList正常识别:
library(plotly) listToPlot <- list( x = unique(round(100*runif(100))), y = unique(round(100*runif(100))), z = unique(round(100*runif(100))), q = unique(round(100*runif(100))) ) l <- htmltools::tagList() if(length(listToPlot) > 3){ for(i in c(2:length(listToPlot))){ p <- ggVennDiagram::ggVennDiagram(listToPlot[c(1,i)]) l[[i-1]] <- ggplotly(p) } }else{ if(length(listToPlot) > 1){ p <- ggVennDiagram::ggVennDiagram(listToPlot) l[[1]] <- ggplotly(p) } } l
内容的提问来源于stack exchange,提问作者tomsu
相关产品推荐
相关产品推荐

