2016-03-24 1 views
1

Je veux utiliser les arguments points (...) dans une expression dans replicate. J'ai remarqué qu'ils n'ont pas d'effet faire de cette façon: cependant,en utilisant l'argument points dans l'expression répliquée échoue - pourquoi exactement?

foo <- function(k=1, n=10, ...) 
{ 
    replicate(k, rnorm(n, ...)) 
} 

foo(2, mean=100) 

Les résultats ne sont pas une moyenne de 100.

  [,1]  [,2] 
[1,] 0.2859647 -0.1046510 
[2,] -0.7867414 0.5347617 

L'utilisation d'un emballage, fonctionnera.

foo2 <- function(k=1, n=10, ...) 
{ 
    f <- function() rnorm(n, ...) 
    replicate(k, f()) 
} 

foo2(2, mean=100) 

maintenant, les résultats ont une moyenne de 100.

  [,1]  [,2] 
[1,] 100.9644 100.6287 
[2,] 100.0804 101.0218 

Quels sont exactement les mécaniciens vont ici lors de l'évaluation de l'argument expr dans replicate. Quelqu'un peut-il donner une explication du comportement?

+0

vous avez raison. Merci! Et pour moi: RTM, RTM:/ –

+0

Les joies de l'évaluation non standard. Utilisez simplement 'sapply' directement dans cet exemple spécifique. – Roland

Répondre

1

Ce comportement est documenté:

Si expr est un appel de fonction, être au courant des hypothèses sur l'endroit où il est évalué , et en particulier ce qui ... pourrait se référer. Vous pouvez passer des arguments supplémentaires nommés à un appel de fonction en tant qu'arguments supplémentaires à répliquer: voir 'Exemples'.

Et dans la section "Exemples":

## use of replicate() with parameters: 
foo <- function(x = 1, y = 2) c(x, y) 
# does not work: bar <- function(n, ...) replicate(n, foo(...)) 
bar <- function(n, x) replicate(n, foo(x = x)) 
bar(5, x = 3)