【问题标题】:How to write an R function that creates a series of plotly plots interspersed with markdown如何编写一个 R 函数来创建一系列散布有降价的绘图
【发布时间】:2019-01-19 01:15:34
【问题描述】:

我有一个函数可以生成可变数量的plotly 图形并创建 R 降价标头,例如

### Caption for plot

这些标题最终出现在 RStudio 下生成的 R markdown html 报告中的浮动目录中。

我知道如何使用htmltools::tagList 来生成一系列htmlplotly 对象,这些对象将全部呈现在一个流中,但我不知道如何用markdown 替换htmltools::HTML('foo') 部分htmltools::tagList(list(plot_ly(...), HTML('caption stuff), ...)) 元素。

【问题讨论】:

  • 虽然不是直接适用(大约是ggplot2),但您可以采用stackoverflow.com/a/47339394/3358272 的方法。具体来说,目的是让一个块创建降价文本,并使其在 (post-knitr) 降价文件中按原样显示。也许您需要的最大技巧是results="asis" 的块选项?
  • 做到了。谢谢!我用{r test2,results='asis'} k <- c('## TOC test entry', '{r junk}', 'x1=runif(10);', 'y1=runif(10);', 'plot_ly(data.frame(x1,y1), x=~x1, y=~y1)', '') cat(trimws(knitr::knit(text = knitr::knit_expand(text = k), quiet = TRUE)))
  • 我可以想象这种方法的缓存会出现问题,所以如果有更直接的方法也很好。在输入答案格式之前,我将稍等片刻。
  • FrankHarrell,通过为块添加```{r chunkname,cache=TRUE,results='asis'},它被缓存了。我通过在与subchunkify 的调用相同的块中添加Sys.sleep 来进行测试,并且在随后的调用中睡眠没有发生(并且图像仍然存在)。它之所以有效是因为knitr 基于当前块的名称(不是生成的块)和其中的代码进行缓存,因此runif 对块的缓存没有随机影响。
  • 这样做的一个副作用是,如果您的 subchunkify 函数定义本身发生变化,因为它位于不同的块中,它可能不会导致绘图块无效缓存。这可以通过添加cache.globals="subchunkify"dependson="chunk_with_subchunkify" 来缓解,这两个选项都在yihui.name/knitr/options/#cache 中定义。

标签: html r rstudio r-markdown plotly


【解决方案1】:

感谢r2evans,这是我的问题的解决方案。这里R 是一个字符向量列表,其中每个元素都是文本和markdown 的混合体。 Plplotly 对象的列表。 nP 是每个列表的长度。

bn <- paste0('c', round(runif(1, 0, 1e6)))  # base chunk name
for(i in 1 : nP) {
  cn <- paste0(bn, i)  # name of individual generated chunk
  Plti <- Pl[[i]]      # fetch i'th plotly graphic object
  k <- c(R[[i]], paste0('```{r ', cn, ',echo=FALSE}'), 'Plti', '```')
  cat(trimws(knitr::knit(text=knitr::knit_expand(text=k), quiet=TRUE)))
  }
}

【讨论】:

  • 注意:如果上面列表R中的字符向量有一个标题,例如"## Subheading",标题需要被字符串元素"\n"包围,所以标题将被识别为降价。此外,trimws() 需要删除。 \n 字符与标题位于同一字符串中是行不通的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多