2010-06-04 5 views
7

Tengo algunos archivos .Rdata que contienen funciones guardadas tal como se define en approxfun().modificar el texto del cuerpo de los objetos de funciones existentes

Algunos de los archivos de salvar anteriores al cambio de approxfun de "base" paquete de "estadísticas", por lo que el cuerpo tiene

PACKAGE = "base" 

y el paquete incorrecto hace que la función falle. Puedo arreglarlo (myfun) y simplemente reemplazar "base" por "stats", pero quiero una forma automática más ordenada.

¿Puedo hacer esto con gsub() y body() de alguna manera?

yo puede conseguir el texto del cuerpo y el sustituto de allí con

as.character(body(myfun)) 

pero no saben cómo convertir de nuevo en que una "llamada" y reemplazar la definición.

(Sé que una solución mejor es haber guardado los datos utilizados originalmente por approxfun y simplemente volver a crear la función, pero me pregunto si hay una manera sensata de modificar la existente.)

Edición: He encontrado aquí

What ways are there to edit a function in R?

+0

posible duplicado de [? ¿Qué formas hay de editar una función en R] (http://stackoverflow.com/questions/2458013/what-ways-are-there-to-edit-a-function-in-r) –

+0

Intenté 'body (foo) <- gsub (" PACKAGE = 'base' "," PACKAGE = 'stats' " , body (foo)) 'para ti, pero body() no devuelve texto por lo que no puedes usar la manipulación de texto para cambiarlo. Lo verifiqué con @MrFlick –

+2

¿podría escribir su propia respuesta para que esta publicación ya no quede "sin respuesta"? –

Respuesta

3

Utilice la función substitute.

Por ejemplo:

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

Usando body, tratar myfun como una lista para seleccionar lo que desea cambiar en la función:

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

Al cambiar esto, debe utilizar el substitute función para que reemplace la parte de la función con un objeto call o name, según corresponda. La sustitución con cadenas de caracteres no funciona, ya que las funciones no se almacenan ni operan como cadenas de caracteres.

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

Ahora la pieza seleccionada de la función ha sido sustituido:

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