假设我有一个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
就可以了。我该怎么做?预先感谢。
答案 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()
```
哪个呈现为:
我们看到,在对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脚本获取所有函数(其他对象)而不是 specific 函数。