Велисарий дал основной метод. Я представлю продвинутый метод, потому что вы, кажется, хотите учиться.
Сначала позвольте мне сказать, что я увидел то, что, по моему мнению, было упрощением вашего кода, и я сделал их, надеюсь, не по ошибке.
Я буду использовать этот пример данных на иллюстрациях ниже:
data = Prepend[
RandomInteger[99, {5, 12}],
DateString[{1, #}, "MonthName"] & /@ Range@12
];
Цель
Поскольку основной функцией является Grid
, имеет смысл разрешить передачу параметров в нее.
У вас есть ряд опций, которые определяют вашу таблицу. Я хочу иметь возможность удобно изменить их.
Я хочу, чтобы пользовательские опции не были поняты Grid
.
Осуществление
Цель № 1
Добавлен шаблон аргумента opts:OptionsPattern[]
, который соответствует любой последовательности Option -> Setting
аргументов и присваивает ей имя opts
. (Подробнее см. OptionsPattern .) Затем opts
вставляется в базовую функцию перед другими параметрами для Grid
. Это позволяет любым явно заданным опциям переопределять значения по умолчанию или вводить новые.
customTabular[data_, opts : OptionsPattern[]] :=
Grid[MapAt[Rotate[#, 90 Degree] & /@ # &, data, 1],
opts,
Background -> {{{White, Pink}}},
Dividers -> {All, {2 -> True}},
ItemSize -> {1 -> 5},
Alignment -> {Center, {1 -> Top}},
Frame -> True,
FrameStyle -> Thickness[2],
ItemStyle -> Directive[FontSize -> 15, Black, Bold]
] // Text
Примеры:
customTabular[data]
customTabular[data, Background -> LightBlue]
Цель № 2
Параметры, которые определяют ваш табличный формат, могут быть отделены от тела функции. Это позволит их удобно менять или ссылаться на них. Я начинаю с очистки предыдущего определения с ClearAll
. Затем я устанавливаю значение по умолчанию Options
для customTabular
:
ClearAll[customTabular]
Options[customTabular] =
{Background -> {{{White, Pink}}},
Dividers -> {All, {2 -> True}},
ItemSize -> {1 -> 5},
Alignment -> {Center, {1 -> Top}},
Frame -> True,
FrameStyle -> Thickness[2],
ItemStyle -> Directive[FontSize -> 15, Black, Bold]};
Теперь правильная функция. Здесь Options@customTabular
получает приведенные выше правила.
customTabular[data_, opts : OptionsPattern[]] :=
Grid[MapAt[Rotate[#, 90 Degree] & /@ # &, data, 1],
opts,
Sequence @@ Options@customTabular
] // Text
Теперь вы можете легко изменить значения по умолчанию с помощью SetOptions
. Пример: * * тысяча шестьдесят-девять
SetOptions[customTabular,
Background -> {{{LightMagenta, LightOrange}}}
];
customTabular[data]
Цель № 3
Теперь я хочу добавить параметр, который не передается Grid
. Я выбираю "Rotation"
для изменения поворота текста строки заголовка.
Снова я очищаю предыдущее определение и параметры по умолчанию. Обратите внимание на включение "Rotation" -> 90 Degree
в список.
ClearAll[customTabular]
Options[customTabular] =
{Background -> {{{White, Pink}}},
Dividers -> {All, {2 -> True}},
ItemSize -> {1 -> 5},
Alignment -> {Center, {1 -> Top}},
Frame -> True,
FrameStyle -> Thickness[2],
ItemStyle -> Directive[FontSize -> 15, Black, Bold],
"Rotation" -> 90 Degree};
Теперь мне нужен способ использовать эту новую опцию, и мне нужно, чтобы эта опция не отправлялась на Grid
:
Я получаю доступ к опции с помощью OptionValue
, которая дает значение по умолчанию, если ни одно из них не указано явно.
Я передаю только действительные Grid
опции, используя FilterRules
.
Сначала я присоединяю любые явные опции к началу списка Options@customTabular
, снова, чтобы переопределить значения по умолчанию.
customTabular[data_, opts : OptionsPattern[]] :=
Grid[MapAt[Rotate[#, OptionValue["Rotation"]] & /@ # &, data, 1],
Sequence @@ FilterRules[{opts} ~Join~ Options@customTabular, Options@Grid]
] // Text
Пример:
SetOptions[customTabular, Background -> {{{LightBrown, LightYellow}}}];
customTabular[data,
Dividers -> All,
"Rotation" -> -90 Degree,
FrameStyle -> {Darker@Red, Thick}
]