2010-06-04 7 views
7

Ho alcuni file .Rdata che contengono funzioni salvate come definito da approxfun().modificare il corpo del testo degli oggetti funzione esistenti

Alcuni dei file di salvataggio pre-data la modifica approxfun dal pacchetto "base" per "stats", e così il corpo ha

PACKAGE = "base" 

e il pacchetto sbagliato causa la funzione che sicuro. Posso correggere (myfun) e semplicemente sostituire "base" con "stats", ma voglio un modo automatico più ordinato.

Posso farlo in qualche modo con gsub() e body()?

posso ottenere il corpo del testo e sostituire lì con

as.character(body(myfun)) 

ma non so come trasformare che di nuovo in un "call" e sostituire la definizione.

(so che una soluzione migliore è quella di aver salvato i dati originariamente utilizzati da approxfun e semplicemente ricreare la funzione, ma mi chiedo se c'è un modo ragionevole per modificare quello esistente.)

Edit: ho trovato qui

What ways are there to edit a function in R?

+0

possibile duplicato di [? Quali modi ci sono per modificare una funzione in R] (http://stackoverflow.com/questions/2458013/what-ways-are-there-to-edit-a-function-in-r) –

+0

Ho provato 'body (foo) <- gsub (" PACKAGE = 'base' "," PACKAGE = 'stats' " , body (foo)) 'per te, ma body() non restituisce il testo, quindi non puoi usare la manipolazione del testo per cambiarlo. Ho verificato questo con @MrFlick –

+2

potresti quindi scrivere la tua risposta in modo che questo post non sia più "senza risposta"? –

risposta

3

Utilizzare la funzione substitute.

Ad esempio:

myfun <- function(x,y) { 
    result <- list(x+y,x*y) 
    return(result) 
} 

Utilizzando body, trattare myfun come un elenco per selezionare quello che si desidera modificare nella funzione:

> body(myfun)[[2]][[3]][[2]] 
x + y 

Quando si cambia questo, è necessario utilizzare il Funzione substitute in modo da sostituire la parte della funzione con un oggetto call o name, a seconda dei casi. La sostituzione con stringhe di caratteri non funziona poiché le funzioni non vengono memorizzate come o utilizzate come stringhe di caratteri.

body(myfun)[[2]][[3]][[2]] <- substitute(2*x) 

Ora il pezzo selezionato della funzione è stata sostituita:

> myfun 
function (x, y) 
{ 
    result <- list(2 * x, x * y) 
    return(result) 
} 
Problemi correlati