2011-08-11 14 views
6

La mia prima semplice Palette è supponiamo di:problema Ombra quando ottenere un pacchetto da un azione tavolozza

  • Aggiunge il mio pacchetti Path to $Path

ActionMenu["test",{"The Simple Packages Path":> AppendTo[$Path, ToFileName[{NotebookDirectory[], "02 Simple Packages"}]]}]

  • Prendi i miei pacchetti

ActionMenu["Load Packages", {"Get my package":> Get["myPackage`"]}]

  • Posizionare sulla cella ingresso selezionato (o ad una nuova cella di input), una data espressione ingresso, contenente diversi segnaposti.

OpenerView[{"my Package", Button["construct", Paste[[email protected]@construct[Placeholder["description"],Placeholder["another description"]]]]}]

Il problema è che io continuo a ricevere messaggi "ombra" quando si fa clic sulla voce di menu azione "ottenere il mio pacchetto". E sono sicuro che non sto caricando due volte il pacchetto intenzionalmente. Quando clicco su "costruisci", scrive Global`construct["description","another description"]. Ma sono sicuro di non averlo definito prima di ottenere il pacchetto (ho ucciso il kernel sui miei test).

Sai cosa c'è che non va?

(io uso Get sui miei pacchetti, invece di Needs, al fine di garantire un avvio pulito del contesto pacchetto)

anche: fai a sapere di un modo più semplice di fare la Paste[[email protected] che assicura sia che l'espressione di essere la pasta non viene valutata e viene inserita in una cella di input, anche quando non è selezionata alcuna cella?

+0

Ho corretto alcuni errori nelle parentesi, probabilmente dovute al copia-incolla. C'era un 'invece di un 'nella tua istruzione Get. Ho cambiato anche questo. Potrebbe aver fatto parte del tuo problema? –

+0

No. In realtà ho avuto problemi con il copia incolla, e anche per mostrare il testo con un formato "codice". Sorrey per la leggera incongruenza del codice (in realtà è un pacchetto di un codice che ha molte più cose nel mezzo, con Item, Style, ecc ...) –

risposta

6

Ok, sembra che il tuo problema sia dovuto all'interazione tra l'analisi e la creazione dell'interfaccia. Quello che vorresti in questo caso è ritardare l'analisi dei simboli del pacchetto nell'interfaccia - costruendo codice (simboli del pacchetto che usi nelle funzioni di azione dei pulsanti), dall'interfaccia - tempo di creazione, fino all'ora del pulsante "premere" (supponendo che a quel punto, il pacchetto è stato caricato). Ecco un modo per farlo:

Column[{ActionMenu["Load Packages", 
    {"Get my package" :> Get["ANOVA`"]}], 
    OpenerView[{"ANOVA", Button["construct", 
     With[{sym = Symbol["ANOVA"]}, 
     Paste[[email protected]@sym[Placeholder["DATA"]]]]]}]}] 

Quello che abbiamo fatto qui è quello di utilizzare With per iniettare il simbolo nel codice per la funzione del pulsante. Ma, nel momento in cui viene analizzato il codice dell'interfaccia, impediamo la creazione del simbolo Global con questo nome - questo è ciò che accade in caso contrario, e questo è ciò che causa il tuo problema.

EDIT

Se si sa per certo che si usa solo simboli (funzioni) di pacchetti, e non dal Global' contesto, qui è una versione che sarà "protetto" da questo problema: lo farà Remove il simbolo generato se il suo contesto risulta essere Global' - e quindi premendo il pulsante prima che il pacchetto sia stato caricato si otterrebbe semplicemente un messaggio di avviso (io uso il simbolo package per allegare il messaggio a - dovrebbe essere sostituito da qualunque sia il nome della tua interfaccia - funzione di creazione):

package::noload = "Please load the package containing symbol `1`"; 
Column[{ActionMenu["Load Packages", 
    {"Get my package" :> Get["ANOVA`"]}], 
    OpenerView[{"ANOVA", Button["construct", 
     With[{sym = Symbol["ANOVA"]}, 
     If[Context[sym] === "Global`", 
      Message[package::noload, Style[ToString[sym], Red]]; 
      Remove[sym];, 
      (* else *) 
      Paste[[email protected]@sym[Placeholder["DATA"]]]]]]}]}] 
+0

Anche questa domanda SO sembra pertinente: http://stackoverflow.com/questions/4988427/accidental-shadowing-and-removedsymbol/. In particolare, nel mio post lì, illustro lo stesso trucco con l'uso di 'Symbol' per ritardare l'analisi fino all'ora di esecuzione. –

+0

Capito le soluzioni. Grazie mille. Quello che non capisco è perché l'analisi dell'interfaccia deve definire i simboli nel contesto globale. L'interfaccia non dovrebbe elaborare il codice al suo interno fino a quando non premo il pulsante, perché è necessario includere tutti i simboli, non ancora elaborati, all'interno del contesto globale? –

+1

@ P.Fonseca Questa è la differenza tra la fase di analisi e la fase di valutazione. Il codice che inserisci in FrontEnd viene sempre analizzato prima di essere valutato. Il tuo codice 'Column [...]' viene valutato e analizzato prima. Tuttavia, alcune parti di esso, in particolare il codice per il gestore di pulsanti, non valutano durante il tempo di creazione dell'interfaccia (che è ottenuto dall'attributo 'HoldRest' di' Button'). Ma, quel codice viene ancora analizzato, e poiché il simbolo - la creazione è una parte del processo di analisi, e nessun simbolo con questo nome esiste ancora sul '$ ContextPath', viene creato un simbolo' Globale'. –

2

Beh, non ho il vostro pacchetto, quindi per la prova ho cambiato il menu azione per ottenere il pacchetto ANOVA:

ActionMenu["Load Packages", {"Get my package" :> Get["ANOVA`"]}] 

ANOVA[{{1, 1}, {1, 2}, {2, 4}, {2, 3}}] ora funziona senza intoppi. Nessuna lamentela sullo shadowing. Questo suggerisce che la causa del tuo problema di shadowing si trova da qualche altra parte. Ho notato, tuttavia, che la parola ANOVA rimane blu. Questo sarà correlato al problema che hai segnalato here.

+0

ActionMenu ["Carica pacchetti", {"Ottieni il mio pacchetto ":> (Ottieni [" ANOVA' "]; Block [{nb}, nb = Crea documento [ ExpressionCell [Rinvia [ToExpression [Nomi [" ANOVA' *]]], "Input"], Visibile -> false]; SelectionMove [nb, Tutto, notebook]; SelectionEvaluate [nb]; NotebookDelete [nb];])}] –

+0

si prega di provare questo: Colonna [{ActionMenu [ "Load Packages", { "Get il mio pacchetto ":> Ottieni [" ANOVA' "]]], OpenerView [{" ANOVA ", Button [" costruisci ", Incolla [StandardForm @ Defer @ ANOVA [Segnaposto [" DATA "]]]]}]}] –

+0

@ P.Fon seca Questo mi fa un messaggio ombra. Il pulsante incolla incolla Global'ANOVA [segnaposto] che è il contesto sbagliato. –

Problemi correlati