Как удалить входную ячейку при оценке? - PullRequest
5 голосов
/ 06 мая 2011

Я хотел бы сделать следующее: при оценке входной ячейки она должна самоуничтожиться (т.е. удалить себя).Я пытался взломать что-то вместе с SelectionMove и NotebookDelete, но не совсем получил то, что хотел.

Вот возможные варианты использования:

  • theкоманда может быть сокращением для ряда других команд, которые будут генерироваться динамически и вставляться в записную книжку

  • команда может использоваться только для побочных эффектов (например, для установки параметра записной книжки илиоткрыть новый блокнот);оставление команды в блокноте после оценки не имеет смысла и создает беспорядок

Редактировать: Согласно Мистеру Волшебнику, ответ - SelectionMove[EvaluationNotebook[], Previous, Cell]; NotebookDelete[];.Я не знаю, почему это не сработало для меня раньше.Вот некоторый код, который использует эту идиому.

writeAndEval[nb_, boxExpr_] := (NotebookWrite[nb, 
    CellGroupData[{Cell[BoxData[boxExpr], "Input"]}]];
   SelectionMove[nb, Previous, Cell];
   SelectionMove[nb, Next, Cell];
   SelectionEvaluate[nb]);

addTwoAndTwo[] := Module[{boxExpr},
  boxExpr = RowBox[{"2", "+", "2"}];
  SelectionMove[EvaluationNotebook[], Previous, Cell];
  NotebookDelete[];
  writeAndEval[EvaluationNotebook[], boxExpr];
  ]

Теперь, выполнение addTwoAndTwo[] удаляет исходный ввод и выглядит так, как будто вы оценили «2 + 2».Конечно, вместо этого вы можете делать все что угодно и не обязательно печатать в блокноте.

Правка 2: Абстракция Саши довольно элегантна.Если вам интересно использовать его в реальных условиях, ознакомьтесь с кодом, который я разместил в вопросе «что в вашей сумке для инструментов»: Что находится в вашей сумке для инструментов Mathematica?

Ответы [ 2 ]

9 голосов
/ 06 мая 2011

Чтобы повлиять на все ячейки ввода, оцените это записной книжкой:

SetOptions[EvaluationNotebook[], CellEvaluationFunction -> 
  ( (
    SelectionMove[EvaluationNotebook[], All, EvaluationCell]; NotebookDelete[];
    ToExpression@#
  )&)
]

Если вы хотите воздействовать только на одну ячейку, выберите ячейку и используйте инспектор параметров, чтобы установить CellEvaluationFunction, как указано выше.

8 голосов
/ 06 мая 2011

Или, опираясь на Мр. Wizard решение, вы можете создать функцию SelfDestruct, которая будет удалять ячейку ввода, если вы собираетесь делать это только изредка:

SetAttributes[SelfDestruct, HoldAllComplete];
SelfDestruct[e_] := (If[$FrontEnd =!= $Failed,
   SelectionMove[EvaluationNotebook[], All, EvaluationCell]; 
   NotebookDelete[]]; e)

Затем оценивая 2+3//SelfDestruct, выводит 5 и удаляет входную ячейку. Этот сценарий использования кажется мне более привлекательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...