2010-11-02 13 views
6

Ragazzi, questo mi fa impazzire.Comportamento sconcertante di 'sostituto` in R

Questo funziona come previsto:

eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33)) 
eval(eobj) 
obj 
[[1]] 
[1] 32 

[[2]] 
[1] 33 

Ora, provate questo:

efun <- substitute(fun <- function() a+ b, list(a = 32, b = 33)) 
str(efun) 
# language fun <- function() 32 + 33 
eval(efun) 
fun 
# function() a+ b 

cosa sta succedendo qui? How on earth eval mette le mani sulla forma originale dell'espressione?

risposta

8

Causa quando si stampa fun in realtà è la sorgente di stampa della funzione (vedere attributes(fun)) che non è modificata da substitute.

Si noti che quando si definisce a o nel risultato della funzione dell'area di lavoro globale sono uguali.

È possibile visualizzare il codice effettivo della funzione tramite body(fun).

o confrontare:

print.function(fun, useSource=FALSE) 
# function() 
# 32 + 33 
print.function(fun, useSource=TRUE) # Which is default 
# function() a+ b 
+0

Yap, è la fonte davvero. Ma sono ancora confuso, da dove viene la fonte? La fonte del divertimento è tenuta separata dall'oggetto stesso? Expression 'efun' non ha alcun riferimento alla fonte. 'eval' non ha accesso diretto alla definizione originale. – VitoshKa

+0

Suppongo che la fonte sia impostata prima dei lavori "sostitutivi". Questa è 'function' crea oggetto di tipo expression (language?) Con argomento source e quindi sostituisce i valori di' a' e 'b' all'interno di un'espressione con i valori appropriati left source intoccata. – Marek

+2

'attr (fun," source ")' mostra la sorgente che sta tenendo in giro per la tua funzione e che cosa 'print' effettivamente stampa. Se non c'è alcun attributo "source" 'allora' print' mostrerà la funzione effettiva. Quindi 'attr (fun," source ") <- NULL' causerà' print' per mostrare la funzione effettiva piuttosto che il contenuto dell'attributo '" source "'. Anche 'options (keep.source = FALSE)' può essere usato per disattivare completamente questo comportamento, nel qual caso le funzioni non avranno un attributo '" source "' in primo luogo. –

Problemi correlati