Zdefiniuj wszystkie funkcje w jednym pliku .R, wywołaj je z innego pliku .R. Jak, jeśli to możliwe?

95

Jak wywołać funkcje zdefiniowane w pliku abc.R w innym pliku, powiedzmy xyz.R?

Dodatkowe pytanie brzmi: jak wywołać funkcje zdefiniowane w abc.R z wiersza poleceń / wiersza poleceń R?

G Shah
źródło

Odpowiedzi:

141

Możesz wywołać, source("abc.R")a następnie source("xyz.R")(zakładając, że oba te pliki znajdują się w twoim bieżącym katalogu roboczym.

Jeśli abc.R to:

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

a xyz.R to:

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

to zadziała:

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

Nawet jeśli istnieją cykliczne zależności, to zadziała.

Np. Jeśli abc.R to:

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

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

a xyz.R to:

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

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

następnie,

> source("abc.R")
> source("xyz.R")
> fooXYZ(3) 
[1] 55
>
A_K
źródło
10
Niuans: wystarczy tylko raz do sourcepliku / funkcji. Następnie znajduje się w Twoim obszarze roboczym i możesz z niego korzystać w dowolnym momencie. Jeśli to zmienisz, musisz go ponownie pozyskać. Jeśli twoje funkcje bardzo się zmieniają od czasu konwertowania kodu, umieść je wszystkie w jednym pliku i za każdym razem źródłuj całość. Można również mieć oddzielny, mniejszy plik, który 1. stanowi źródło większej kolekcji funkcji i 2. Uruchamia przypadki testowe. W R jest wiele sposobów na organizację pracy.
Bryan Hanson
5
Dzięki za niuanse, Bryan. Pokazałem to jako 2 scenariusze, którymi może się zastanawiać większość ludzi z języków proceduralnych. To tak, jakby pliki były edytowane w celu dodania cyklicznej zależności, w którym to przypadku muszą być zasilane (jak pokazano), a cykle nie wpływają na pozyskiwanie plików.
A_K
Dziękuję wam obojgu. @A_K: wielkie dzięki za zwrócenie uwagi na problem cyklicznej zależności. Zaoszczędziłem mi kilka godzin przekopywania się przez dokumentację R, która „można poprawić” :)
G Shah,