首页 > 解决方案 > 在 RMarkdown 中包含来自外部源 R 的函数

问题描述

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

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

现在我只想包含 foo不是整个 functions.RRMarkdown 中的一个块。

如果我希望包含所有功能,按照这个答案,我可以通过以下方式完成:

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

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

标签: rr-markdownknitr

解决方案


我将这个答案的方法改编为一个相关的问题来解决这个问题。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 脚本中获取所有函数(不获取其他对象)而不是特定函数。


推荐阅读