【问题标题】:Include a function from external source R in RMarkdown在 RMarkdown 中包含来自外部源 R 的函数
【发布时间】:2019-07-08 11:34:25
【问题描述】:

假设我有一个functions.R 脚本,其中我定义了一些函数:

foo <- function(x) print(x-2)
bar <- function(x) print(x^3)
...

现在我想在 RMarkdown 的一个块中包含 only foo(并且不是全部 functions.R

如果我希望在this answer 之后包含所有功能,我可以通过以下方式完成:

``` {r, code = readLines("functions.R")}
```

但是,我只需要在块中foo。我该怎么做?提前致谢。

【问题讨论】:

  • 如果你知道你想要的功能在哪几行,你可以按照here的方法进行
  • 谢谢@duckmayr,我不知道我能做到这一点。但是我有点不愿意这样做,因为脚本可能会发生变化(在某处添加/删除几行),这会把事情搞砸。
  • 当然,这绝对是一种非常脆弱的方法;现在添加更强大的方法

标签: r r-markdown knitr


【解决方案1】:

我将this answer 的方法改编为一个相关问题来解决这个问题。1

我存储在文件functions.R你上面的两个示例函数中:

foo <- function(x) print(x-2)
bar <- function(x) print(x^3)

然后我创建以下 R Markdown 文档:

---
title: "SO Answer"
author: "duckmayr"
date: "7/8/2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

We set up a function to source an R script, but only assign to the global environment the functions we want:

```{r source_function}
source_functions <- function(fcn_names, file_name) {
    env <- new.env()
    source(file_name, local = env)
    for ( i in 1:length(fcn_names) ) {
        assign(fcn_names[i], get(fcn_names[i], envir = env), envir = .GlobalEnv)
    }
}
```

Then we can call it to get *only* the function `foo()`:

```{r get_foo}
source_functions("foo", "functions.R")
ls()
```

This will also work for multiple functions:

```{r get_foo_and_bar}
source_functions(c("foo", "bar"), "functions.R")
ls()
```

呈现为:

我们看到在第一次调用source_functions() 时,只有foo() 函数被添加到全局环境中,但没有bar() 函数应该可以解决您的问题.如果您想要来自functions.R 的多个函数,这也可以,如第二次调用source_functions() 所示。

更新:显示函数代码

我们可以编辑我们的source_functions() 函数来显示它所提供的函数的代码,如下所示:

source_functions <- function(fcn_names, file_name) {
    env <- new.env()
    source(file_name, local = env)
    n <- length(fcn_names)
    result <- character(n)
    for ( i in 1:n ) {
        name <- fcn_names[i]
        fcn <- get(name, envir = env)
        code <- capture.output(show(fcn))
        code <- paste(code[-which(grepl("<env", code))], collapse = " ")
        assign(name, fcn, envir = .GlobalEnv)
        result[i] <- paste(name, "<-", code, collapse = " ")
    }
    return(result)
}

然后我们的文档呈现为


1 那个问题和答案(1)不在R Markdown的上下文中,更重要的是(2)只演示了如何从R脚本中获取所有函数(没有得到其他对象)而不是特定的函数。

【讨论】:

  • 太棒了!有没有办法,就像另一个函数一样,在输出中包含函数的原始代码? (就像在块中编写的代码,就像块定义中的code = readLines("functions.R") 对整个脚本所做的那样。)
  • @ManuelHaqi 当然,很容易。答案已更新以包含该功能
  • 再次感谢@duckmayr。实际上我的意思有点不同:我希望函数 echoed 作为输出中的一段代码。我已经在这个image 中展示了它。您更新后的解决方案给出了 A,但我的意思是 B(或 C)。
  • 啊,我明白了……我认为这会更困难。如果我以后有时间,我会看看我能不能解决这个问题
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多