любой прием, чтобы объединить 2 элемента Item [] в одно выражение с целью использования в макросе? - PullRequest
4 голосов
/ 27 декабря 2011

V 8.04. Это только в контексте Manipulate use.

Вот простой пример использования элемента для размещения элементов управления в разных местах пользовательского интерфейса с помощью манипуляции

Manipulate[Plot[Sin[z], {z, -Pi, Pi}, ImageSize -> 100],
 Item[Control[{{x, 0, "x="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Left],
 Item[Control[{{y, 0, "y="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Right]
 ]

enter image description here

Тем не менее, я использую макро-метод Леонида (ссылка здесь ), чтобы помочь мне создать свои элементы управления пользовательским интерфейсом, поэтому я хотел бы сделать что-то вроде

 Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{im = ImageSize -> Tiny},

   Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],ControlPlacement -> Left],
   Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]

   ]    
 ]

Выше не работает, потому что у нас больше нет ОДНОГО выражения, чтобы осчастливить With, который имеет синтаксис

 With[{x=x0}, expression ]

И в вышеприведенном 2 Item s теперь не ОДНО выражение, а 2.

Эта проблема появляется только тогда, когда я хочу использовать Item для управления размещением. В противном случае я бы использовал Grid[] и соединил свои разные вещи внутри Grid, и тогда проблема была бы решена.

Но я, конечно, не могу использовать Item внутри сетки, чтобы каждый Item находился в другом месте. Все Grid должно быть в одном месте.

Я думал, что обернуть 2 элемента в Sequence[] может работать, но это не так.

вопрос в следующем: есть ли уловка, чтобы объединить 2 вышеупомянутых предмета в ОДНО выражение, чтобы сделать С счастливым?

В настоящее время я решаю эту проблему в своем пользовательском интерфейсе, просто разбивая вещи на 2 отдельных With, например:

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{im = ImageSize -> Tiny},
   Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], 
    ControlPlacement -> Left]
   ],

 Evaluate@With[{im = ImageSize -> Tiny},
   Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], 
    ControlPlacement -> Right]
   ]

 ]

И все работает отлично.

Но, конечно, в приведенном выше тексте я теряю некоторые преимуществ использования имен макросов для совместного использования между многими кодами построения элементов управления.

обновление 26.12.11 20:37

Вот пример использования одного макроса внутри другого. Я думаю, что это проблема Hold. Уловка, показанная ниже, не работает для этого. Постараюсь выяснить это: (На практике я использую макросы 2 уровней, так как я определяю некоторые макросы на одном уровне и использую их для создания макросов более высокого уровня на втором уровне. Здесь я показываю только очень простой пример того, что я имею в виду)

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{im = ImageSize -> Tiny},

   Evaluate@With[{},

     ## &[
      Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
      Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
      ]

     ]
   ]
 ]

Я почти уверен, что мне нужно HoldAll вещь, чтобы вставить в нужное место, чтобы разобраться с этим. Постараюсь разобраться и доложить здесь. Кофе почти готов;)

обновление 9 вечера

Хорошо, MrWizard показал мне проблему с выше. Я должен не иметь оценку на внутренних макросах. Я забыл об этом. Вот оно сейчас, отлично работает:

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{},

   With[{},
    ## &[
     Item[Control[{{x, 0, "x="}, 0, 10, 1}], ControlPlacement -> Left], 
     Item[Control[{{y, 0, "y="}, 0, 10, 1}], ControlPlacement -> Right]
     ]

    ](*close second With*)
   ](*close first With*)

 ](*close Manipulate*)

Спасибо за ответ, оба очень полезны.

Ответы [ 2 ]

7 голосов
/ 27 декабря 2011

Используйте Sequence, возможно, как:

Manipulate[
   Plot[Sin[z], {z, -Pi, Pi}], 
   Evaluate@With[{im = ImageSize -> Tiny}, 
      Sequence @@ {
         Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left], 
         Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
         }
      ]
   ]

Редактировать

Тот же подход, но с другим макросом ( предупреждение , этот путь приводит к безумию ...)

Manipulate[
   Plot[Sin[z], {z, -Pi, Pi}], 
   Evaluate @ With[{
      control = Function[{var, name, place}, 
         Item[Control[{{var, 0, name <> "="}, 0, 10, 1, ImageSize -> Tiny}],  ControlPlacement -> place], 
         HoldAll
         ]}, 
   Sequence @@ {control[x, "x", Left], control[y, "y", Right]}
   ]]
6 голосов
/ 27 декабря 2011

Не забывайте о Sequence и Apply.

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
 Evaluate[
  Sequence @@ With[{im = ImageSize -> Tiny},
    Hold[
     Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
     Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
    ]
   ]
]]

Mathematica graphics

Ответ Бретта заставил меня понять, что то же самое можно сделать более кратко, как это:

Manipulate[
 Plot[Sin[z], {z, -Pi, Pi}],
 Evaluate @ With[{im = ImageSize -> Tiny},
   ## &[
    Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left], 
    Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
   ]
  ]
] 

Поскольку With не имеет атрибута SequenceHold, мы не можем просто выполнить Sequence [Item, Item], но мы можем использовать ## &[Item, Item], поскольку & задерживает оценку.

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