r - 在 RMarkdown 中包含来自外部源 R 的函数
问题描述
假设我有一个functions.R
脚本,其中定义了一些函数:
foo <- function(x) print(x-2)
bar <- function(x) print(x^3)
...
现在我只想包含( foo
而不是整个 functions.R
RMarkdown 中的一个块。
如果我希望包含所有功能,按照这个答案,我可以通过以下方式完成:
``` {r, code = readLines("functions.R")}
```
但是,我只需要foo
在块中。我该怎么做?提前致谢。
解决方案
我将这个答案的方法改编为一个相关的问题来解决这个问题。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 脚本中获取所有函数(不获取其他对象)而不是特定函数。
推荐阅读
- haskell - Haskell列表理解中的生成器不起作用
- linux - GREP 在文本文件中搜索第二列
- java - MySql jdbc ojdcn 与 gradle
- ios - RCTEventEmitter 在制作 iOS 存档时导致问题
- python - ImportError:无法从“序列”(未知位置)导入名称“序列”
- excel - 根据单元格值从变量工作表名称复制的 VBA 代码
- javascript - 由于代理错误未找到:错误:尝试执行 axios Post 时证书已过期
- mfc - Ownerdraw ComboBox 文本垂直居中对齐
- sql - 如何优化游标到基于集合的运算符查询?
- pg-promise - 在 pg-promise 中设置每个用户的会话变量