Domanda

OK, quindi sto cercando di utilizzare le classi S4 per costruire un oggetto molto complesso, con le scanalature tra cui una mezza dozzina di matrici, alcune liste, e probabilmente un lavandino della cucina o due in là. L'oggetto viene inizializzato facendo riferimento ae disimballaggio un oggetto di configurazione che ho già definito. E 'abbastanza facile definire la classe con setClass (), ma sto avendo difficoltà a capire un modo elegante di impostare gli slot nella setMethod ( "inizializzazione").

Il problema è che devo impostare elementi specifici delle mezza dozzina matrici basate su parti di quell'oggetto configurazione. Per ciascun elemento dell'oggetto configurazione, posso dovere impostare elementi specifici di alcune delle matrici. Si noti che le matrici sono nella portata / ambiente della funzione di inizializzazione. Ho poi hanno nidificato funzioni all'interno della funzione di inizializzazione che fanno l'assegnazione effettiva delle matrici, o questa è l'idea in ogni caso. Queste funzioni possono naturalmente vedere matrici, ma non possono Modifica perché il <- operatore crea una nuova matrice se la variabile originale non è stato definito nel contesto attuale . R è passare per valore, e significa che. Questo è vero anche per gli slot della .Object che sto cercando di inizializzazione. Quindi non posso usare funzioni annidate per fare l'inizializzazione.

Purtroppo, queste funzioni nidificate essere necessario modificare alcune delle matrici, quindi la restituzione di valori e di fare l'assegnazione nella funzione di inizializzazione principale non è pratico o elegante. (Ma è possibile, se ho farcito copie delle matrici in liste restituite e poi combinati in funzione di inizializzazione principale. Brutto però, e richiederebbe un sacco di codice aggiuntivo.)

E iterazione (che impedirebbe questo problema scoping) non è molto pratico sia per la natura gerarchica dell'oggetto configurazione, che vuole davvero essere attraversato con chiamate ricorsive.

L'ultima opzione posso pensare sarebbe quella di utilizzare la funzione di assegnazione () con l'opzione envir per forzare il compito di applicare alla variabile non locale. Ma usando ambienti del genere sembra icky, come un goto ...

Quindi, qual è l'approccio più piratesco? Stick con la programmazione funzionale pura e costruire strutture di dati brutti solo per passare in modo inefficiente matrici intorno ridondanti? Prova a trovare una soluzione iterativa che evita le funzioni del tutto? Usare la magia profonda giocando con gli ambienti?

È stato utile?

Soluzione

Hai guardato <<-? Fa assegnando nell'ambiente genitore un po 'più facile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top