Определите все функции в одном файле .R, вызовите их из другого файла .R. Как, если возможно?

95

Как мне вызвать функции, определенные в файле abc.R, в другом файле, например xyz.R?

Дополнительный вопрос: как вызвать функции, определенные в abc.R, из командной строки / приглашения R?

G Shah
источник

Ответы:

141

Вы можете вызвать с source("abc.R")последующим source("xyz.R")(при условии, что оба эти файла находятся в вашем текущем рабочем каталоге.

Если abc.R:

fooABC <- function(x) {
    k <- x+1
    return(k)
}

а xyz.R - это:

fooXYZ <- function(x) {
    k <- fooABC(x)+1
    return(k)
}

тогда это будет работать:

> source("abc.R")
> source("xyz.R")
> fooXYZ(3)
[1] 5
> 

Даже если есть циклические зависимости, это сработает.

Например, если abc.R это:

fooABC <- function(x) {
    k <- barXYZ(x)+1
    return(k)
}

barABC <- function(x){
    k <- x+30
    return(k)
}

а xyz.R это:

fooXYZ <- function(x) {
    k <- fooABC(x)+1
    return(k)
}

barXYZ <- function(x){
    k <- barABC(x)+20
    return(k)
}

тогда,

> source("abc.R")
> source("xyz.R")
> fooXYZ(3) 
[1] 55
>
A_K
источник
10
Нюанс: нужно только один раз sourceиспользовать файл / функцию. Тогда он находится в вашем рабочем пространстве, и вы можете использовать его в любое время. Если вы его измените, вам придется заново его использовать. Если ваши функции сильно меняются с тех пор, как вы конвертируете код, поместите их все в один файл и каждый раз просто отправляйте все это целиком. У вас также может быть отдельный файл меньшего размера, который 1. является источником большей коллекции функций и 2. запускает ваши тестовые примеры. В R есть много способов организовать рабочий процесс.
Bryan Hanson
5
Спасибо за нюанс, Брайан. Я демонстрировал это как два сценария, о которых могло бы задуматься большинство людей, использующих процедурные языки. Это похоже на то, как если бы файлы были отредактированы для добавления циклической зависимости, и в этом случае они должны быть выделены ресурсами (как показано), и циклы не влияют на источники файлов.
A_K
Спасибо вам обоим. @A_K: большое спасибо за выделение проблемы циклической зависимости. Сэкономил мне несколько часов на копание в документации R, которую можно улучшить :)
G Shah