2011-12-19 17 views

Respuesta

5

no Bueno, una llamada hace tener formales, únicos argumentos reales ... La diferencia es que una función como foo <- function(x, y, ..., z=42) puede ser llamado con argumentos reales como foo(42, bar=13).

... Pero conseguir los argumentos se puede hacer así:

a <- call('foo', a=42, 13) 
as.list(a)[-1] 
#$a 
#[1] 42 
# 
#[[2]] 
#[1] 13 

... por el contrario, generalmente se puede (no siempre) encontrar la función real y encontrar los formales para ello:

a <- quote(which(letters=='g')) 
formals(match.fun(a[[1]])) 
#$x 
# 
#$arr.ind 
#[1] FALSE 
# 
#$useNames 
#[1] TRUE 

Aquí había necesidad de añadir un poco de manejo de errores si la función no se puede encontrar (al igual que con la llamada a foo arriba) ...

+2

usted no tiene que obligar a la llamada a una lista - puedes simplemente w ork con ella como una lista, siempre y cuando recuerde que el primer elemento es la función. También es probable que desee 'match.call' en lugar de' match.fun' - de esa manera puede combinar los argumentos predeterminados y suministrados. – hadley

+0

Bueno, no querría 'match.call' en lugar de' match.fun', pero es una adición útil: 'match.call (eval (a [[1]]), a)' – hadley

+0

@hadley - Gracias por mencionar 'match.call'. No forzar a una lista puede funcionar si sabes exactamente lo que estás haciendo, pero 'a [-1]' se imprimirá de manera muy extraña, y no se puede pasar como args a 'do.call' por ejemplo ... – Tommy

Cuestiones relacionadas