在RMarkdown中包含来自外部源R的功能

时间:2019-07-08 11:34:25

标签: r r-markdown knitr

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

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

现在,我想在RMarkdown的块中仅包含 foo(而不是整个 functions.R)。

如果我想包含所有功能,请遵循this answer,我可以通过以下方式完成此操作:

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

但是,我只需要foo就可以了。我该怎么做?预先感谢。

1 个答案:

答案 0 :(得分: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()
```

哪个呈现为:

enter image description here

我们看到,在对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)
}

然后我们的文档呈现为

enter image description here


1 该问题和答案(1)不在R Markdown的上下文中,更重要的是(2)仅演示了如何从R脚本获取所有函数(其他对象)而不是 specific 函数。