Defina todas as funções em um arquivo .R, chame-as de outro arquivo .R. Como, se possível?


93

Como chamo funções definidas no arquivo abc.R em outro arquivo, digamos xyz.R?

Uma pergunta complementar é: como chamo funções definidas em abc.R a partir do prompt / linha de comando R?

Respostas:


137

Você pode chamar source("abc.R")seguido por source("xyz.R")(assumindo que ambos os arquivos estejam em seu diretório de trabalho atual.

Se abc.R for:

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

e xyz.R é:

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

então isso vai funcionar:

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

Mesmo se houver dependências cíclicas, isso funcionará.

Por exemplo, se abc.R é este:

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

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

e xyz.R é este:

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

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

então,

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

9
Uma nuance: você só precisa de sourceum arquivo / função uma vez. Então, ele estará em sua área de trabalho e você poderá usá-lo a qualquer momento. Se você alterá-lo, terá que recriá-lo. Se suas funções estão mudando muito desde que você está convertendo o código, coloque-as todas em um arquivo e apenas forneça o código inteiro sempre. Você também pode ter um arquivo menor separado que 1. origina a coleção maior de funções e 2. Executa seus casos de teste. No R, há muitas maneiras de organizar seu fluxo de trabalho.
Bryan Hanson

5
Obrigado pela nuance, Bryan. Eu estava demonstrando isso como 2 cenários sobre os quais a maioria das pessoas de linguagens procedurais pode se perguntar. É como se os arquivos fossem editados para adicionar a dependência cíclica, caso em que eles precisam de recursos (como mostrado) e os ciclos não afetam a origem dos arquivos.
A_K

Obrigado a vocês dois. @A_K: muito obrigado por destacar o problema da dependência cíclica. Me poupou algumas horas de escavação na documentação R "pode ​​ser melhorada" :)
G Shah
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.