Я адаптирую подход из этого ответа к связанному вопросу, чтобы решить эту проблему. 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 (без получения других объектов) вместо определенных функций.