2011-08-11 10 views
6

mój prosty pierwsza paleta jest przypuszczać, aby:Cień Problem podczas pobierania pakiet z akcji Palette

  • Dołącz mojej ścieżce pakiety do $Path

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

  • dostać moje pakiety

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

  • Miejsce na wybranej komórce wejściowej (lub na nowej komórce wejściowej), dane wyrażenie wejściowe, zawierające różne lokalizatory.

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

Problemem jest to, że wciąż otrzymuję „shadow” wiadomości po kliknięciu na „dostać paczkę” z menu Akcja. I jestem pewien, że nie zamierzam podwójnie ładować przesyłki celowo. Kiedy klikam na "skonstruuj", pisze Global`construct["description","another description"]. Ale jestem pewien, że nie zdefiniowałem go przed otrzymaniem pakietu (zabiłem jądro podczas testów).

Czy wiesz, co jest nie tak?

(używam Get na moich pakietów, zamiast Needs, aby zapewnić czysty start w kontekście pakietu)

również: wiesz o prostszej drodze robi Paste[[email protected] zapewniający zarówno, że wyrażenie jest wklej nie jest oceniany i trafia do komórki wejściowej, nawet jeśli nie wybrano komórki?

+0

Poprawiłem kilka błędów w nawiasach, które prawdopodobnie wynikały z skopiowania i wklejenia. W instrukcji Get pojawiło się "zamiast". Ja też to zmieniłem. Może to było częścią twojego problemu? –

+0

Nie. Właściwie miałem problemy z kopią wklejania, a także pokazywałem tekst w formacie "kodu". Sorrey z powodu niewielkiej niezgodności kodu (w rzeczywistości jest to fragment kodu, który ma znacznie więcej rzeczy w środku, z Item, Style, itp.) –

Odpowiedz

6

OK, wygląda na to, że Twój problem wynika z interakcji między parsowaniem a tworzeniem interfejsu. W tym przypadku chciałbyś opóźnić parsowanie symboli pakietu w interfejsie - budując kod (symbole pakietów używane w funkcjach przycisków), od interfejsu - czas tworzenia, aż do czasu "naciśnięcia przycisku" (zakładając, że do tego czasu pakiet został załadowany). Oto jeden ze sposobów, aby to zrobić:

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

Co my tu jest użycie With wstrzyknąć symbol do kodu dla funkcji przycisku. Jednak w czasie analizy kodu interfejsu uniemożliwiamy stworzenie symbolu o tej nazwie - to dzieje się inaczej, a to właśnie powoduje Twój problem.

EDIT

Jeśli wiesz na pewno, że używasz tylko symbole (funkcji) z opakowania, a nie z kontekstu Global', tutaj jest wersją, która będzie „chronione” od tego problemu: to będzie Remove wygenerowany symbol, jeśli jego kontekst okazuje się być Global' - a tym samym naciśnięcie przycisku przed załadowaniem paczki spowodowałoby jedynie pojawienie się komunikatu ostrzegawczego (używam symbolu package, aby dołączyć wiadomość do - należy zastąpić czymkolwiek jest nazwa funkcji tworzenia interfejsu):

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

To pytanie wydaje się również istotne: http://stackoverflow.com/questions/4988427/accidental- shadowing-and-removedsymbol/. W szczególności, w moim poście, ilustruje tę samą sztuczkę z użyciem 'Symbol', aby opóźnić analizowanie do czasu wykonania. –

+0

Zrozumiał rozwiązania. Dziękuję Ci bardzo. Czego nie rozumiem, to dlaczego analiza interfejsu wymaga zdefiniowania symboli w kontekście globalnym. Interfejs nie powinien przetwarzać kodu wewnątrz, dopóki nie naciśnie przycisku, dlaczego musi zawierać wszystkie symbole, jeszcze nie przetworzone, w kontekście globalnym? –

+1

@ P.Fonseca Jest to różnica między etapem analizowania a etapem oceny. Kod, który wpisujesz w FrontEnd, zawsze jest analizowany, zanim zostanie oceniony. Twój kod 'Kolumna [...]' zostanie oceniony - i przeanalizowany przed tym. Jednak niektóre jego części, w szczególności kod obsługi przycisku, nie są oceniane w czasie tworzenia interfejsu (co osiąga się za pomocą atrybutu 'HoldRest' w' Button'). Ale ten kod nadal jest przetwarzany, a ponieważ tworzenie symbolu jest częścią procesu parsowania i nie ma symboli o tej nazwie w '$ ContextPath', tworzony jest symbol' Global'. –

2

Cóż, nie mam swoją paczkę, więc do testowania Zmieniłem menu akcji, aby uzyskać pakiet ANOVA:

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

ANOVA[{{1, 1}, {1, 2}, {2, 4}, {2, 3}}] działa teraz bez żadnych przeszkód. Żadnych skarg na shadowing. To sugeruje, że przyczyna twojego problemu z cieniem leży gdzie indziej. Zauważyłem jednak, że słowo ANOVA pozostaje niebieskie. Będzie to związane z problemem, który zgłosiłeś here.

+0

ActionMenu ["Load Packages", {"Pobierz moją paczkę ":> (Pobierz [" ANOVA "]; Zablokuj [{nb}, nb = CreateDocument [ ExpressionCell [Odwróć [To Expression [Nazwy [" ANOVA' * "]]], " Input "], Visible -> false]; SelectionMove [nb, Wszystko, notebooki]; SelectionEvaluate [NB]; NotebookDelete [NB];])}] –

+0

spróbuj tego: Kolumna [{ActionMenu [ "Pakiety Load", { "Pobierz mój pakiet ":> Pobierz [" ANOVA ""]}], OpenerView [{"ANOVA", przycisk ["skonstruuj", Wklej [StandardForm @ Defer @ ANOVA [Placeholder ["DATA"]]]]}]}] –

+0

@ P.Fon seca To dostaje mi wiadomość w cieniu. Przycisk wklejenia Global'ANOVA [placeholder], który jest niewłaściwym kontekstem. –

Powiązane problemy