如何跳过在htmlwidgets :: saveWidget()中编写依赖项?

时间:2018-07-06 15:20:42

标签: r htmlwidgets r-plotly

当使用散点图可视化数据时,我想将小部件编写为html文档,而无需npm install 每次都编写依赖项,前提是假定这些依赖项已经存在,以节省处理时间。这些小部件必须是独立的,以节省磁盘空间。

htmlwidgets::saveWidget

library(plotly) t <- Sys.time() p <- plot_ly(ggplot2::diamonds, y = ~price, color = ~cut, type = "box") htmlwidgets::saveWidget(as_widget(p), "test.html", selfcontained = F, libdir = NULL) print(Sys.time() - t) 在我的计算机上。

这仅会在依赖时产生约6 mb的数据(串扰1.0.0,htmlwidgets-1.2,jquery-1.11.3,plotly-binding-4.7.1.9000,plotly-htmlwidgets-css-1.38.3,plotly- main-1.38.3,typedarray-0.1)

Time difference of 4.303076 secs写入依赖关系,尽管这些文件已经存在。可以预防吗?

1 个答案:

答案 0 :(得分:0)

好问题。我试图在代码中的注释中内联回答。 htmlwidgets依赖项来自两个来源:小部件列表中的htmlwidgets::getDependency()dependencies元素。更改src href dependencies to文件instead of中的means these dependencies will not get copied. However, the dependencies from元素htmlwidgets :: getDependency()are harder to overwrite, but in the case will only copy htmlwidgets.js and plotly-binding.js `,与其他四个相比,它很小。

library(plotly)

p <- plot_ly(ggplot2::diamonds, y = ~price, color = ~cut, type = "box")

# let's inspect our p htmlwidget list for clues
p$dependencies

# if the src argument for htmltools::htmlDependency
#   is file then the file will be copied
#   but if it is href then the file will not be copied

# start by making a copy of your htmlwidget
#   this is not necessary but we'll do to demonstrate the difference
p2 <- p

p2$dependencies <- lapply(
  p$dependencies,
  function(dep) {
    # I use "" below but guessing that is not really the location
    dep$src$href = "" # directory of your already saved dependency
    dep$src$file = NULL

    return(dep)
  }
)

# note this will still copy htmlwidgets and plotly-binding
#  requires a much bigger hack to htmlwidgets::getDependency() to change

t <- Sys.time()
htmlwidgets::saveWidget(as_widget(p), "test.html", selfcontained = F, libdir = NULL)
print(Sys.time() - t)

t <- Sys.time()
htmlwidgets::saveWidget(as_widget(p2), "test.html", selfcontained = F, libdir = NULL)
print(Sys.time() - t)