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?

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
>

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.