2017-12-14 83 views
5

Załóżmy, że mam funkcję, która pobiera argument k i zwraca inną funkcję, która pobiera argument n, ale używa w swojej treści funkcji k.Sposób drukowania treści funkcji za pomocą przeanalizowanej zmiennej

makeFn <- function(k) { 
    function(n){ 
    rep(k,n) 
    } 
} 

five <- makeFn(5) 

five(3) 
# [1] 5 5 5 

body(five) 
# { 
# rep(k, n) 
# } 

Jak mogę wydrukować ciało five tak, że pokazuje rep(5,n) zamiast rep(k,n)?

+0

Jakich elastycznych rozwiązań potrzebujesz? Czy istnieje więcej poziomów funkcji zagnieżdżonych? W tym prostym przypadku możesz użyć 'substitute' z jego wygodnym argumentem" env ". Ponieważ 'substitute' nie oceni swojego pierwszego argumentu, musimy skonstruować wywołanie typu' eval (call ("substitute", body (five), environment (five))) ' –

Odpowiedz

0

Jedną opcją jest połączenie eval i bquote.

makeFn <- function(k) { 
    eval(bquote(function(n) rep(.(k),n))) 
} 

five <- makeFn(5) 
body(five) 
# rep(5, n) 

Zapis .() mówi bquote aby ocenić, co jest w nawiasach, potem to wynik w wyrażeniu.

Powiązane problemy