superponer - ¿De qué maneras hay para editar una función en R?
superponer graficas en r (5)
Digamos que tenemos la siguiente función:
foo <- function(x)
{
line1 <- x
line2 <- 0
line3 <- line1 + line2
return(line3)
}
Y que queremos cambiar la segunda línea para que sea:
line2 <- 2
¿Cómo lo harías tú?
Una forma es usar
fix(foo)
Y cambia la función.
Otra forma es simplemente escribir la función nuevamente.
¿Hay otra manera? (Recuerde, la tarea era cambiar solo la segunda línea)
Lo que me gustaría es, de alguna manera, representar la función como un vector de cadenas (bueno, personajes), luego cambiar uno de sus valores y luego convertirlo en una función nuevamente.
O echa un vistazo a la función de depuración trace()
. Probablemente no sea exactamente lo que está buscando, pero le permite jugar con los cambios y tiene la característica agradable de que siempre puede volver a su función original con untrace()
. trace()
es parte del paquete base
y viene con una página de ayuda completa y completa.
Comience por llamar a as.list (body(foo))
para ver todas las líneas de su código.
as.list(body(foo))
[[1]]
`{`
[[2]]
line1 <- x
[[3]]
line2 <- 0
[[4]]
line3 <- line1 + line2
[[5]]
return(line3)
Luego, simplemente define qué agregar a su función y dónde colocarla definiendo los argumentos en trace()
.
trace (foo, quote(line2 <- 2), at=4)
foo (2)
[1] 4
Dije al principio que la trace()
podría no ser exactamente lo que está buscando ya que realmente no cambió su tercera línea de código y en su lugar simplemente reasignó el valor a la line2
en la siguiente línea de código insertada. Se vuelve más claro si imprime el código de su función ahora rastreado
body (foo)
{
line1 <- x
line2 <- 0
{
.doTrace(line2 <- 2, "step 4")
line3 <- line1 + line2
}
return(line3)
}
Puede usar la función '' cuerpo ''. Esta función devolverá el cuerpo de la función:
fnx = function(a, b) { return(a^2 + 7*a + 9)}
body(fnx)
# returns the body of the function
Entonces, una buena forma de ''editar'' una función es usar ''cuerpo'' en el lado izquierdo de una declaración de asignación:
body(fnx) = expression({a^2 + 11*a + 4})
fix
es la mejor forma que conozco de hacer esto, aunque también puede usar edit
y volver a asignarlo:
foo <- edit(foo)
Esto es lo que hace la fix
internamente. Es posible que desee hacer esto si desea volver a asignar sus cambios a un nombre diferente.
fixInNamespace
es como fix
para las funciones de un paquete (incluidas las que no se han exportado).
> body(foo)[[3]] <- substitute(line2 <- 2)
> foo
function (x)
{
line1 <- x
line2 <- 2
line3 <- line1 + line2
return(line3)
}
(El "{" es cuerpo (foo) [[1]] y cada línea es un elemento sucesivo de la lista.)