首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:将多个html小部件保存在一起

R:将多个html小部件保存在一起
EN

Stack Overflow用户
提问于 2021-01-07 04:33:34
回答 1查看 1.9K关注 0票数 1

我正在使用R编程语言。我有兴趣学习如何将多个"html小部件“保存在一起。我已经能够手动创建不同类型的html小部件:

代码语言:javascript
复制
#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", "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, "<br>", 
                            "Last_Name:", Last_Name, "<br>", "vehicle:", vehicle, "<br>"))

小部件2:

代码语言:javascript
复制
##### 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:

代码语言:javascript
复制
#####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:

代码语言:javascript
复制
####widget_4

library(igraph)
library(dplyr)
library(visNetwork)


Data_I_Have <- data.frame(
   
    "Node_A" = c("John", "John", "John", "Peter", "Peter", "Peter", "Tim", "Kevin", "Adam", "Adam", "Xavier"),
    "Node_B" = c("Claude", "Peter", "Tim", "Tim", "Claude", "Henry", "Kevin", "Claude", "Tim", "Henry", "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)

在这里,我发现了另一个堆栈溢出帖子,其中提出了一个类似的问题:Using R and plot.ly, how to save multiples htmlwidgets to my html?

在这篇文章中,它解释了如何将几个html小部件放在一起--回答问题的人编写了一个函数来这样做:

代码语言:javascript
复制
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个小部件保存在一起:

代码语言:javascript
复制
save_tags(widget_1, widget_2, widget_3, widget_4)

但是这样做,我得到了以下错误:

代码语言:javascript
复制
 Error in dirname(file) : a character vector argument expected 

有一种简单明了的方法可以将多个html小部件保存在一起吗?

谢谢

注意:我知道您可以在R中使用combineWidgets()函数:

代码语言:javascript
复制
library(manipulateWidget)
combineWidgets(widget_1, widget_2, widget_3, widget_4)

但是,我正在使用一台没有互联网接入或USB接口的计算机。这台计算机有一个预装的R的副本和有限的库(它有所有的库使用在我的问题,除了"manipulateWidget")。我正在寻找最简单的方法来将多个html小部件保存在一起(例如,这在基本R中是可能的吗)?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-07 11:47:13

如果格式不太重要,您可以使用tagList合并这些小部件并直接保存它们:

代码语言:javascript
复制
htmltools::save_html(tagList(widget_1, widget_2, widget_3, widget_4), file = "C://Users//Me//Desktop//widgets.html")

(不用说,您需要编辑filepath!)

如果要控制小部件的布局,可以将每个部件包装在div中,然后将其样式设置为:

代码语言:javascript
复制
doc <- htmltools::tagList(
  div(widget_1, style = "float:left;width:50%;"),
  div(widget_2,style = "float:left;width:50%;"),
  div(widget_3, style = "float:left;width:50%;"),
  div(widget_4, style = "float:left;width:50%;")
)

htmltools::save_html(html = doc, file = "C://Users//Me//Desktop//widgets.html")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65606653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档