我将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脚本中获取所有函数(没有得到其他对象)而不是特定的函数。