2012-07-19 16 views
38

He buscado una referencia para aprender sobre las funciones de reemplazo en R, pero no he encontrado ninguna. Estoy tratando de entender el concepto de las funciones de sustitución en R. tengo el código de abajo pero no entenderlo:¿Qué son las funciones de reemplazo en R?

"cutoff<-" <- function(x, value){ 
x[x > value] <- Inf 
x 
} 

y luego llamar de corte con:

cutoff(x) <- 65 

Podría ¿Alguien explica qué función de reemplazo hay en R?

+5

Esta es una Q perfectamente aceptable para SO –

+2

posible duplicado de ['levels <-' (¿Qué hechicería es esto?] (Http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this) –

+0

Ver ** Extendiendo R.- John Chambers (2016) **: * páginas 73 a 79 del Capítulo 5 * –

Respuesta

42

Cuando se llama a

cutoff(x) <- 65 

usted en efecto llamar

x <- "cutoff<-"(x = x, value = 65) 

El nombre de la función tiene que ser citado, ya que es un nombre sintácticamente válida, pero no estándar y el analizador haría interpretar <- como el operador no como parte del nombre de la función si no fue citado.

"cutoff<-"() es igual que cualquier otra función (aunque con un nombre raro); se realiza un cambio en su argumento de entrada sobre la base de value (en este caso se está fijando en cualquier valor mayor que x65 a Inf (infinito)).

La magia realmente se está haciendo cuando se llama a la función como esta

cutoff(x) <- 65 

porque R es analizar eso y sacando los diversos bits para realizar la llamada real, se muestra más arriba.

Más genéricamente tenemos

FUN(obj) <- value 

R encuentra la función "FUN<-"() y establece la llamada al pasar obj y value en "FUN<-"()y mande el resultado de "FUN<-"() ser asignado de nuevo a obj, de ahí que llama :

obj <- "FUN<-"(obj, value) 

Una referencia útil para esto en la formación es R Language Definition Section 3.4.4: Subset assignment; la discusión es un poco oblicua, pero parece ser la referencia más oficial que existe (las funciones de reemplazo se mencionan de paso en las preguntas más frecuentes de R (diferencias entre R y S-PLUS) y en la referencia de lenguaje R (varias cuestiones técnicas), pero no he encontrado ninguna discusión adicional en la documentación oficial).

+0

respuesta muy muy útil ... Muchas gracias – Sam

9

Gavin proporciona una excelente discusión sobre la interpretación de la función de sustitución. Quería proporcionar una referencia ya que también me la solicitó: R Language Definition Section 3.4.4: Subset assignment.

+0

Lo agradezco Brian. – Sam

+5

útil, pero respuesta de solo-enlace ... Estoy editando la respuesta de @ GavinSimpson para agregarla ... –

2

Recuerde, en funcionamiento todo R es una llamada de función (por lo tanto también las operaciones de asignación) y todo lo que existe es un objeto. funciones de reemplazo actúan como si modifican sus argumentos en lugar como en

colnames(d) <- c("Input", "Output") 

Tienen el identificador <- al final de su nombre y devuelven una copia modificada del objeto argumento (no primitivos funciones de sustitución) o el mismo objeto (funciones de reemplazo primitivos)

en el símbolo R, el siguiente no funcionará:

> `second` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 
> x <- 1:10 
> x 
[1] 1 2 3 4 5 6 7 8 9 10 
> second(x) <- 9 
Error in second(x) <- 9: couldn't find function "second<-" 

Como se puede ver, R es la búsqueda para el medio ambiente no second pero para second<-. Así que vamos a hacer lo mismo pero utilizando un identificador de dicha función en su lugar:

> `second<-` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 

Ahora, la asignación en la segunda posición del vector de obras:

> second(x) <- 9 
> x 
[1] 1 9 3 4 5 6 7 8 9 10 

También escribió un script sencillo para listar todas las funciones de reemplazo en el paquete base R, find it here.

+0

Escribí un comentario en tu blog sobre el guión para sacar todas las funciones de reemplazo: "¿No estás perdiendo esas funciones de reemplazo, que tienen el "' <-' "en el medio? Al igual que, por ejemplo,' split <-. default' y 'split <-. data.frame'?" –

+0

@ManuelS Estoy revisando: '> Split <- hoja.de.datos ¡Error:. '.data.frame' nicht gefunden > Split ' – TMOTTM

+0

@ManuelS Hadley no escribió cualquier cosa sobre tales funciones nombradas en Advanced R. ¿Tiene una referencia para las funciones que menciona? – TMOTTM

Cuestiones relacionadas