Включить функцию из внешнего источника R в RMarkdown - PullRequest
0 голосов
/ 08 июля 2019

Предположим, у меня есть скрипт 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 Ответ

1 голос
/ 08 июля 2019

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

...