如何用R生成serVis可视化的独立HTML文件?
问题
R语言的LDAvis包用serVis函数生成LDA主题建模可视化时,默认会输出包含CSS、JS和HTML的文件夹。直接打开里面的index.html会因为浏览器跨域限制显示空白,要分享给100多人,不可能要求所有人都修改浏览器设置。而Python的PyLDAvis能轻松生成可直接分享的独立HTML页面,请问怎么用R生成单文件的LDAvis可视化?
可复现代码:
# Install and load required packages library(LDAvis) library(tm) library(topicmodels) # Set seed for reproducibility set.seed(123) # Create fake data documents <- c("This is the first document.", "The second document is here.", "And this is the third one.", "Is this the first document?") # Create a Document-Term Matrix corpus <- Corpus(VectorSource(documents)) dtm <- DocumentTermMatrix(corpus) #lda num_topics <- 3 topicModel <- LDA(dtm, k = num_topics, control = list(seed = 9999)) tmResult <- posterior(topicModel) # Create fake JSON data json <- createJSON( phi = tmResult$terms, theta = tmResult$topics, doc.length = rowSums(as.matrix(dtm)), vocab = colnames(as.matrix(dtm)), term.frequency = colSums(as.matrix(dtm)), plot.opts = list(xlab = "", ylab = "") ) # Save fake visualization to a folder serVis(json, out.dir = 'test', open.browser = TRUE)
解决方案
方法1:用serVis自带参数生成独立HTML
serVis函数本身就支持生成单文件可视化,只需添加self.contained = TRUE参数,它会自动把所有依赖的CSS、JS资源内嵌到单个HTML文件里,不需要额外文件夹,直接打开就能正常显示。
修改后的代码:
# Install and load required packages library(LDAvis) library(tm) library(topicmodels) # Set seed for reproducibility set.seed(123) # Create fake data documents <- c("This is the first document.", "The second document is here.", "And this is the third one.", "Is this the first document?") # Create a Document-Term Matrix corpus <- Corpus(VectorSource(documents)) dtm <- DocumentTermMatrix(corpus) # 训练LDA模型 num_topics <- 3 topicModel <- LDA(dtm, k = num_topics, control = list(seed = 9999)) tmResult <- posterior(topicModel) # 生成JSON数据 json <- createJSON( phi = tmResult$terms, theta = tmResult$topics, doc.length = rowSums(as.matrix(dtm)), vocab = colnames(as.matrix(dtm)), term.frequency = colSums(as.matrix(dtm)), plot.opts = list(xlab = "", ylab = "") ) # 生成独立HTML文件 serVis(json, out.dir = 'test', open.browser = TRUE, self.contained = TRUE)
执行后会在test文件夹里生成独立的index.html,直接分享这个文件给他人,对方不用改浏览器设置就能打开查看可视化内容。
方法2:手动内嵌资源(备用方案)
如果self.contained参数出现异常,可借助htmltools包手动把外部资源内嵌到HTML中:
- 先按默认方式生成文件夹版可视化
- 读取HTML内容,将CSS、JS文件内嵌进去
- 保存为新的独立HTML文件
代码示例:
library(htmltools) # 先生成默认的文件夹可视化 serVis(json, out.dir = 'test', open.browser = FALSE) # 读取原始HTML内容 html_content <- readLines("test/index.html") # 读取并内嵌CSS和JS文件 inline_css <- includeCSS("test/lda.css") inline_js <- includeScript("test/d3.v3.min.js") # 组合成新的独立HTML结构 new_html <- tagList( inline_css, inline_js, HTML(paste(html_content, collapse = "\n")) ) # 保存为单文件HTML save_html(new_html, "lda_vis_single.html")
内容的提问来源于stack exchange,提问作者Koot6133
相关产品推荐
相关产品推荐

