Cómo ver el código fuente de la función en R
{
xna lt; - is.na(x)
if (na.rm)
x lt; - x[!xna]
else if (any(xna))
return( rep.int(NA, 5))
x lt ; - sort(x)
n lt; - longitud (x)
if (n == 0)
rep.int(NA, 5)
else {
n4 lt;- piso((n 3)/2 )/2
d lt;- c(1, n4, (n 1)/2, n 1 - n4, n)
0.5 * (x[piso(d)] x[techo(d)])
}
}
lt;environment: namespace.statsgt;
Como se puede ver en el ejemplo anterior, este tipo de código objeto de función es el más fácil de ver y el que más buen aprendizaje material, la mayoría de los objetos funcionales en R aparecen de esta manera.
En segundo lugar, cuando escribimos el nombre de una función como media, obtendremos los siguientes resultados:
función (x,...)
UseMethod("mean ")
lt; entorno: namespace: basegt;
Esto significa que el autor de la función ha "sellado" la función. En este momento podemos probar métodos (media) primero y usar la función métodos para ver qué tipos de funciones medias existen. Obtenemos los siguientes resultados:
[1] media.datos.marco media.Fecha. media.default media.difftime media.POSIXct media.POSIXct media.POSFime media.POSFime Media.POSFime Media.POSFime Media.POSFime Media.POSFime Media.POSFimePOSIXct media.POSIXlt
De hecho, esto se puede entender sencilla, aunque todavía no es lo suficientemente precisa. Porque en R, la función media puede obtener los valores medios de objetos de diferentes tipos, y todavía existen algunas ligeras diferencias en los métodos medios de diferentes tipos de objetos. Por ejemplo, existe una diferencia entre el valor medio de a. vector y el valor medio de un marco de datos, lo que requiere escribir múltiples funciones medias y luego "cerrarlas" hasta que aparezca una media unificada, lo cual es conveniente. Esto también refleja la versatilidad de R, similar a la del lenguaje de programación.
Ahora que sabemos que hay tantos tipos de media, podemos escribir mean.default para probar:
función (x, trim = 0, na.rm = FALSE, ..)
{
if (!is.numeric(x) amp; amp; !is.complex(x) amp; amp; !is.logic(x) ) {
advertencia("El argumento no es numérico ni lógico. Devuelve NA")
return(as.numeric(NA))
}
if (na.rm)
x lt; - x[!is.na(x)]
recortar lt;
n lt; - longitud(x)
if (trim gt; 0 amp; amp; n gt; 0) {
if (is.complex(x))
stop("las medias recortadas no están definidas para datos complejos")
if (trim gt; = 0.5)
return(stats::median(x , na.rm = FALSE))
Retorno (estadísticas: :median(x, na.rm = FALSE)). rm = FALSE))
lo lt; - piso(n * trim) 1
hi lt; - n 1 - lo
x lt; .int (x, parcial = único(c(lo, hola)))[lo:hola]
n lt; hola - lo 1
}
.Internal(mean(x))
}
lt;environment: namespace.basegt;
De manera similar, también puede obtener mean.data. Información específica para marco, media.Fecha, media.difftime, media.POSIXct y media.POSIXlt. Vale la pena señalar que en R, hay muchas funciones similares encapsuladas en una función (en este momento, es probable que la función UseMethod se use de manera similar en la función), también podríamos ingresar mean.default para intentarlo. Esta forma de función se utiliza a menudo como notación de función predeterminada en R.
En tercer lugar, este es un caso especial que algunos dirían que debería agruparse con el segundo caso, pero propondré una categoría separada. En este caso, el motivo también es algo similar al segundo caso, pero no exactamente igual.
Quizás todos estemos familiarizados con la función de trazado. Al escribir el nombre de la función, se obtendrán los siguientes resultados:
función (x, y, ...)
<. p>{ p>if (is.null(attr(x, "clase")) amp; amp; is.function(x)){
nms lt;- nombres( list(... ))
if (missing(y))
y lt; {
if (!" from" en nms)
0
más si (!" to" en nms)
1
más si (!" xlim" en nms)
NULL
}
if ("ylab" en nms)
plot.function(x, y, ...)
else plot.function(x, y, ylab = pegar(deparse(sustituto(x)),
"(x)"), ...)
} p>
else UseMethod("plot")
}
lt; entorno: espacio de nombres: gráficosgt; La función UseMethod también aparece en la función de trama, pero a diferencia de la media, está precedida por muchas declaraciones que tratan de otras cosas.
plot.acf* plot.data.frame* plot.Date* plot.decomposed.ts* plot.default
plot.plot.density plot.ecdf plot.factor* plot .formula*
plot.hclust* plot.histogram* plot.HoltWinters* plot.isoreg* plot.lm
plot.ppr*
plot.prcomp * plot.princomp* plot.profile.nls* plot.spec plot.spec coherencia
plot.spec.plot.phase plot.stepfun plot.stl* plot.table* plot.ts
plot.tskernel* plot.TukeyHSD
Sería impactante si no te dieras cuenta de que la salida de plot es la función misma. Algunas personas pueden haber entendido que la última función UseMethod es en realidad la función predeterminada real que llama a plot.default. Un vistazo rápido a la función plot.default muestra que luego llama a la función plot.xy y luego mira la función plot.xy. y luego la función plot.xy. Hay un .Internal(plot. Esa es básicamente la idea, ahora es el momento de leer sobre los aspectos a tener en cuenta en las funciones de R.
En lugar de escribir directamente en el formulario FUN.default, puede usar getS3method(FUN, "default") para obtener el código. Esto puede resolver el problema de visualización de la mayoría de los códigos de función.
En el segundo caso, dijimos que normalmente puedes obtener los resultados que deseas usando FUN.default. Pero sólo las funciones que llaman a genéricos tienen este "privilegio". Pero lm y otras funciones no, pero también podemos intentar usar métodos (lm) para ver los resultados, y los resultados son:
[1] lm.fit lm.fit.null lm.influence lm.wfit lm. wfit.null
Mensaje de advertencia:
La función 'lm' no parece ser una función de FUN.default. En: métodos(lm)
, la función 'lm' no parece ser una función genérica.
El mensaje de advertencia muestra que lm no es una función genérica, pero aún así proporciona resultados como lm.fit, que pueden considerarse aproximadamente como una serie de funciones relacionadas con lm.
Según la tercera situación, encontraremos que hay algunas funciones marcadas con asteriscos, como plot.stl*, etc., y cuando ingresamos plot.stl o incluso plot.stl*, recibirá un El mensaje dice que no se puede encontrar el objeto o que hay un error en el código. ¡Resulta que cualquier función con * es una función oculta, probablemente porque tiene miedo de ser vista (esto en realidad es una broma)! Queremos ver el código de estas funciones, ¿qué debemos hacer? De hecho, es muy sencillo utilizar el potente getAnywhere (FUN). Al observar el nombre de esta función, puedes adivinar que es muy potente y puede encontrar contenido en cualquier lugar. Los resultados de getAnywhere (plot.stl) son los siguientes:
Encontrar un valor con 'plot.stats
con valor
función (x, etiquetas = colnames(X), set.pars = list(mar = c(0,
6, 0, 6), oma = c(6, 0, 4, 0), tck = -0.01, mfrow = c( nplot ,
1)), main = NULL, range.bars = TRUE, ..., col.range = "gris claro")
{
sers lt; - x$time.series
ncomp lt; - ncol(sers)
datos lt;