根据块内容设置块选项

set chunk options on basis of chunk contents

我有一个 R Markdown 文档。本文档中的某些 R 代码块包含对函数 myFun() 的调用。这个函数总是需要很长时间才能运行。因此,我想自动将包含 myFun() 的任何块设置为具有 cache = TRUE。我无法修改 myFun(),并且包含它的块没有特殊的识别功能。 (例如,它们没有特殊标签。)鉴于这些限制,是否可以为包含 myFun() 的块自动设置 cache = TRUE

我想到的策略是创建一个块挂钩,用于在块的文本中搜索关键字 (myFun),如果找到关键字,则设置 cache = TRUE。不过我不知道这个解决方案是否可行,或者是否有更好的方法。

我在 Yihui Xie 关于 knitr 和 R Markdown 的书中寻找了答案,并且在 knitr Github 站点上搜索了问题。但是我还没有在那些地方找到答案。 SO 上有相关帖子——例如,。但是我还没有找到任何可以解决这个问题的东西。

我倾向于同意 @user2554330 的观点,您可能希望缓存函数 myFun() 而不是代码块(例如,使用 memoise)。

无论如何,回答你的问题:是的,可以将 cache = TRUE 设置为 an option hook,例如,

knitr::opts_hooks$set(cache = function(options) {
  if (any(grepl('myFun(', options$code))) {
    options$cache <- TRUE
  }
  options
})

grepl() 并不是检查代码块是否包含对 myFun() 的调用的完全可靠的方法。如果你想要一个最稳健的方式,你可以尝试 utils::getParseData().