如何解决R:将多个 html 小部件保存在一起
我使用的是 R 编程语言。我有兴趣学习如何将几个“html 小部件”保存在一起。我已经能够手动创建不同类型的 html 小部件:
#widget 1
library(htmlwidgets)
library(leaflet)
library(RColorBrewer)
# create map data
map_data <- data.frame(
"Lati" = c(43.6426,43.6424,43.6544,43.6452,43.6629),"Longi" = c(-79.3871,-79.3860,-79.3807,-79.3806,-79.3957),"Job" = c("Economist","Economist","Teacher","Lawyer"),"First_Name" = c("John","James","Jack","Jason","Jim"),"Last_Name" = c("Smith","Charles","Henry","David","Robert"),"vehicle" = c("car","van","car","none","car")
)
kingdom <- c("Economist","Lawyer","Teacher")
my_palette <- brewer.pal(3,"Paired")
factpal <- colorFactor(my_palette,levels = kingdom)
groups <- unique(map_data$Job)
# finalize map
map <- leaflet(map_data) %>%
addTiles(group = "OpenStreetMap") %>%
addCircleMarkers(~Longi,~Lati,popup = ~Job,radius = 10,weight = 2,opacity = 1,color = ~factpal(Job),fill = TRUE,fillOpacity = 1,group = ~Job
)
widget_1 = map %>%
addLayersControl(overlayGroups = groups,options = layersControlOptions(collapsed = FALSE)) %>%
addTiles() %>%
addMarkers(lng = ~Longi,lat = ~Lati,popup = ~paste("Job",Job,"<br>","First_Name:",First_Name,"Last_Name:",Last_Name,"vehicle:",vehicle,"<br>"))
小部件 2:
##### widget 2
library(plotly)
library(ggplot2)
p_plot <- data.frame(frequency = c(rnorm(31,1),rnorm(31)),is_consumed = factor(round(runif(62))))
p2 <- p_plot %>%
ggplot(aes(frequency,fill = is_consumed)) +
geom_density(alpha = 0.5)
widget_2 = ggplotly(p2)
小部件 3:
#####widget_3
today <- Sys.Date()
tm <- seq(0,600,by = 10)
x <- today - tm
y <- rnorm(length(x))
widget_3 <- plot_ly(x = ~x,y = ~y,mode = 'lines',text = paste(tm,"days from today"))
小部件 4:
####widget_4
library(igraph)
library(dplyr)
library(visNetwork)
Data_I_Have <- data.frame(
"Node_A" = c("John","John","Peter","Tim","Kevin","Adam","Xavier"),"Node_B" = c("Claude","Claude","Claude")
)
graph_file <- data.frame(Data_I_Have$Node_A,Data_I_Have$Node_B)
colnames(graph_file) <- c("Data_I_Have$Node_A","Data_I_Have$Node_B")
graph <- graph.data.frame(graph_file,directed=F)
graph <- simplify(graph)
nodes <- data.frame(id = V(graph)$name,title = V(graph)$name)
nodes <- nodes[order(nodes$id,decreasing = F),]
edges <- get.data.frame(graph,what="edges")[1:2]
widget_4 = visNetwork(nodes,edges) %>% visIgraphLayout(layout = "layout_with_fr") %>%
visOptions(highlightNearest = TRUE,nodesIdSelection = TRUE)
从这里,我发现了另一个提出类似问题的 stackoverflow 帖子:Using R and plot.ly,how to save multiples htmlwidgets to my html?
在这篇文章中,它解释了如何将多个 html 小部件保存在一起 - 回答问题的人编写了一个函数来这样做:
library(htmltools)
save_tags <- function (tags,file,selfcontained = F,libdir = "./lib")
{
if (is.null(libdir)) {
libdir <- paste(tools::file_path_sans_ext(basename(file)),"_files",sep = "")
}
htmltools::save_html(tags,file = file,libdir = libdir)
if (selfcontained) {
if (!htmlwidgets:::pandoc_available()) {
stop("Saving a widget with selfcontained = TRUE requires pandoc. For details see:\n","https://github.com/rstudio/rmarkdown/blob/master/PANDOC.md")
}
htmlwidgets:::pandoc_self_contained_html(file,file)
unlink(libdir,recursive = TRUE)
}
return(htmltools::tags$iframe(src= file,height = "400px",width = "100%",style="border:0;"))
}
我尝试使用此功能将 4 个小部件保存在一起:
save_tags(widget_1,widget_2,widget_3,widget_4)
但是这样做,我得到了以下错误:
Error in dirname(file) : a character vector argument expected
是否有一种简单直接的方法可以将多个 html 小部件保存在一起?
谢谢
注意:我知道你可以在 R 中使用 combineWidgets() 函数:
library(manipulateWidget)
combineWidgets(widget_1,widget_4)
但是,我正在使用一台没有互联网访问权限或 USB 端口的计算机。这台计算机预装了一个带有有限库的 R 副本(它包含我的问题中使用的所有库,除了“manipulateWidget”)。我正在寻找将多个 html 小部件保存在一起的最简单方法(例如,这在基础 R 中是否可行)?
谢谢
解决方法
如果格式不太重要,你可以使用 tagList 合并小部件并直接保存它们:
htmltools::save_html(tagList(widget_1,widget_2,widget_3,widget_4),file = "C://Users//Me//Desktop//widgets.html")
(不用说,您需要编辑文件路径!)
如果你想控制小部件的布局,你可以将每个小部件包装在一个 div 中,然后设置它们的样式:
doc <- htmltools::tagList(
div(widget_1,style = "float:left;width:50%;"),div(widget_2,div(widget_3,div(widget_4,style = "float:left;width:50%;")
)
htmltools::save_html(html = doc,file = "C://Users//Me//Desktop//widgets.html")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。