将 fig.width 传递到标签列表中

Passing fig.width into a taglist

rgl 小部件响应 knitr 代码块选项中指定的图形宽度和高度,例如

```{r fig.width=2, fig.height=2}
library(rgl); example(plot3d);
rglwidget()
```

给出了一个小图(在我的屏幕上是 192 x 192)。但是,如果我将 rglwidget() 放在可浏览的 tagList 中,它不会:

```{r fig.width=2, fig.height=2}
library(rgl); example(plot3d)
library(htmltools)
browsable(tagList(rglwidget(), rglwidget()))
```

这提供了两个全尺寸小部件。调试 Javascript 显示每个都被初始化为 960 x 500,而不是第一个示例中的 192 x 192。

有没有办法说我希望将宽度和高度值传递到 tagList 中的小部件?

P.S。这与rgl无关; leaflet

有同样的问题
```{r fig.width=2, fig.height=2}
library(leaflet); library(htmltools)
browsable(tagList(leaflet() %>% addTiles())
```

由于块中的代码可以读取块的选项,这里最好的解决方案可能是编写获取图形大小(以像素为单位)的小函数,并在小部件的显式设置中使用这些函数。

例如,

```{r fig.width=2, fig.height=2}
library(leaflet); library(htmltools)

# This one is too big:
browsable(tagList(leaflet() %>% addTiles()))

# Get the current figure size in pixels:
w <- function() 
  with(knitr::opts_current$get(c("fig.width", "dpi", "fig.retina")),
       fig.width*dpi/fig.retina)
h <- function() 
  with(knitr::opts_current$get(c("fig.height", "dpi", "fig.retina")),
       fig.height*dpi/fig.retina)

# This is what I wanted:
browsable(tagList(leaflet(width = w(), height = h()) %>% addTiles()))
```