Укажите моноширинный шрифт в `menu`

Язык: R. Вопрос: Могу ли я указать шрифт фиксированной ширины для меню (.. , graphics = T) функция?

Пояснение:

Недавно я задал этот вопрос о том, как заставить пользователя выбирать строку во фрейме данных в интерактивном режиме:

df <- data.frame(a=c(9,10),b=c('hello','bananas'))
df.text <- apply( df, 1, paste, collapse=" | " )
menu(df.text,graphics=T)

enter image description here

Я бы как | , чтобы выстроиться в очередь. В настоящий момент они этого не делают; честно говоря, я не увеличил ширину столбцов до одинаковой ширины.Поэтому я использую формат , чтобы получить одинаковую ширину для каждого столбца (позже я напишу код для автоматического определения ширины каждого столбца, но пока давайте проигнорируем это):

df.padded <- apply(df,2,format,width=8)
df.padded.text <- apply( df.padded, 1, paste, collapse=" | ")
menu( df.padded.text,graphics=T )

enter image description here

Видите, все еще шатко? Тем не менее, если я посмотрю на df.padded , я получу:

> df.padded
     a            b           
[1,] " 9        " "hello     "
[2,] "10        " "bananas   "

Таким образом, каждая ячейка определенно заполнена до одинаковой длины.

Причина этого, вероятно, в том, что шрифт по умолчанию для этого (в моей системе, Linux) не имеет фиксированной ширины.

Итак, мой вопрос: Могу ли я указать шрифт фиксированной ширины для меню (.., graphics = T) ?

Обновление

@RichieCotton заметил, что если вы посмотрите в меню с graphics = T он вызывает select.list , который, в свою очередь, вызывает tcltk :: tk_select.list .

Похоже, мне придется изменить параметры tcltk для этого. Из @jverzani:

library(tcltk)
tcl("option", "add", "*Listbox.font", "courier 10")
menu(df.padded.text,graphics=T)

enter image description here

Учитывая, что menu (..., graphics = T) вызывает tcltk :: tk_select.list , когда graphics ИСТИНА, мой Предполагаю, что это жизнеспособный вариант, так как любой дистрибутив, который может отображать графическое меню в первую очередь, также будет иметь на нем tcltk , поскольку он должен вызывать tk_select.list .

(Кстати, я не могу найти в документации ничего, что подсказало бы мне попробовать tcl ('option', 'add', ...) , не говоря уже о том, что опция называлась * Listbox.font !)

Еще одно обновление - более пристальное внимание уделялось выбору .list и код меню , и он получается в Windows (или если .Platform $ GUI == 'AQUA' - это Mac?), tcltk :: tk_select.list вообще не вызывается, это просто внутренний код. Так что изменение '* Listbox.font' не повлияет на это.

Думаю, я просто:

  • если есть tcltk, загрузите его, установите * Listbox.font как courier и используйте tcltk :: tk_select.list явно
  • , если он нет, попробуйте menu (..., graphics = T) , чтобы хотя бы получить графический интерфейс (который не будет моноширинным, но лучше, чем ничего)
  • , если и это не поможет , затем просто вернитесь в menu (..., graphics = F) , что определенно сработает.

Спасибо всем.

48
задан Community 23 May 2017 в 12:30
поделиться