【问题标题】:set chunk options on basis of chunk contents根据块内容设置块选项
【发布时间】:2020-09-08 21:10:00
【问题描述】:

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

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

我在谢益辉关于knitr和R Markdown的书籍中寻找答案,我在knitr Github站点上搜索了问题。但我还没有在那些地方找到答案。 SO上有相关的帖子——例如,Evaluate a Chunk based on the output format of knitr。但是我还没有找到任何可以说明这个问题的东西。

【问题讨论】:

  • 为什么不缓存所有的块?
  • 另外,为什么不将myFun <- memoise::memoise(myFun)memoise::cache_filesystem( ... ) 一起使用?

标签: r caching r-markdown hook knitr


【解决方案1】:

我倾向于同意 @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()

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多