2015-01-07 2 views

ответ

5

Посмотрите, полезно ли это. По существу, р аргумент выполняется в среде тела Карри() - IED функция:

> body(f2) 
do.call(FUN, c(.orig, list(...))) 
> body(f2)[[1]] 
do.call 
> body(f2)[[3]] 
c(.orig, list(...)) 
> body(f2)[[3]][[2]] 
.orig 
> eval(body(f2)[[3]][[2]]) 
Error in eval(expr, envir, enclos) : object '.orig' not found 
> eval(body(f2)[[3]][[2]], environment(f2)) 
$p 
[1] 2 

В комментариях BrodieG они могут быть использованы в атаке программирования на проблеме:

> environment(f2)$.orig 
$p 
[1] 2 

> environment(f2)$.orig$p 
[1] 2 

Для понять, почему я не наткнуться на том, что изначально сравнивать:

> ls(envir=environment(f2)) 
[1] "FUN" 
> ls(envir=environment(f2) ,all.names=TRUE) 
[1] "..." ".orig" "FUN" 

ls функция отображает только элементы, для которых начальных символов не является не «точкой», если all.names параметр установлен на TRUE.

Так что это также imformative:

> environment(f2) $FUN 
function(x, p) { x^p } 
+0

Спасибо, @BondedDust! – rimorob

+1

'environment (f2) $. Оригинал немного проще. – BrodieG

+1

Согласитесь, что это более элегантно. Возможно, в отличие от вас, я не знал ответа, когда начинал, и показывал путь, по которому я путешествовал, чтобы получить ответ. Я был разочарован в отношении этого подхода, когда пытался: 'ls (environment (f2)) # [1]" FUN "'. 'ls.str' и' lsf.str' также были неподтверждающими. –

Смежные вопросы