2015-01-30 35 views
5

Non sono uno sviluppatore e non riesco a esprimere bene ciò di cui ho bisogno in parole semplici. È collegato a cose come ambienti, scope, enclosure e forse puntatori e riferimenti.R set variabile uguale a quale funzione restituisce. Rivaluta nuovamente la variabile ogni volta che viene chiamata

Dovrebbe essere chiaro con il codice:

a<-c(1,2) 
b<-length(a) 
a<-c(1,2,3) 
b 
[1] 2 

voglio B per tornare 3.

Cosa faccio a cambiare nella seconda riga? È possibile farlo senza definire nuove funzioni personalizzate e utilizzare pacchetti esterni?

Impossibile cercare eval, assegnare, < < - finora

risposta

6

non sto raccomandando che si dovrebbe effettivamente utilizzare, ma makeActiveBinding() farà quello che stai chiedendo:

makeActiveBinding("b", function() length(a), .GlobalEnv) 
a <- c(1,2) 
b 
# [1] 2 
a <- c(1,2,4) 
b 
# [1] 3 
+0

stupefacente. Qual è la migliore fonte di informazioni (ad es. Un libro) in cui posso leggere di più (ad eccezione ovviamente per il bando googling). Esistono "sinonimi" di tale associazione in altri linguaggi di programmazione o argomenti correlati? Mi piacerebbe anche usare qualcosa di simile negli script di shell - si chiama anche binding in bash ?. – stuckNlazy

+0

Hmm. Non sono sicuro. L'idea di base, però, è che dietro le quinte, digitando 'b' si esegue la funzione' length (a) 'ogni volta che viene valutata. Personalmente, sarei molto più a mio agio nel definire una semplice funzione 'b <- function() length (a)' e quindi facendo 'b()' (piuttosto che 'b') per ottenere la lunghezza di' a'. In questo modo aggirai qualsiasi magia oscura che sta realmente accadendo dietro le quinte con ciò che anche "makeActiveBinding" descrive come "un'interfaccia sperimentale". Digitando semplicemente '()', puoi rimanere nel mondo più mainstream delle semplici definizioni di funzioni e chiamate di funzione. –

+0

@ JoshO'Brien - Aggiungerei questo alla risposta piuttosto che lasciarla qui nei commenti. Tutto ciò che hai detto sembra abbastanza saggio per me. – thelatemail

Problemi correlati