Язык: R. Вопрос: Можно ли указать шрифт фиксированной ширины для функции menu(..,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](https://i.stack.imgur.com/npQYm.png)
Я бы хотел, чтобы |
выстроился в линию. Они не в данный момент; честно говоря, я не разложил колонки на одинаковую ширину. Поэтому я использую format
, чтобы получить для каждого столбца одинаковую ширину (позже я напишу код для автоматического определения ширины столбца, но пока проигнорируем это):
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](https://i.stack.imgur.com/HV2or.png)
Видишь, как все еще шатко Тем не менее, если я посмотрю на df.padded
, я получу:
> df.padded
a b
[1,] " 9 " "hello "
[2,] "10 " "bananas "
Таким образом, каждая ячейка определенно имеет одинаковую длину.
Причина этого, вероятно, заключается в том, что шрифт по умолчанию для этого (в любом случае, в моей системе, Linux) не имеет фиксированной ширины.
Итак, мой вопрос:
Можно ли указать шрифт фиксированной ширины для функции menu(..,graphics=T)
?
Обновление
@ RichieCotton заметил, что если вы посмотрите на menu
с 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](https://i.stack.imgur.com/7Wsk3.png)
Учитывая, что menu(...,graphics=T)
вызывает tcltk::tk_select.list
, когда graphics
- ИСТИНА, я предполагаю, что это жизнеспособный вариант, так как любой дистрибутив, который мог бы отображать графическое menu
в первую очередь, также имел бы tcltk
на нем, так как ему нужно позвонить tk_select.list
.
(Кроме того, я не могу найти в документации ничего, что дало бы мне подсказку попробовать tcl('option','add',...)
, не говоря уже о том, что опция называлась *Listbox.font
!)
Еще одно обновление - более внимательно посмотрел на код select.list
и menu
, и оказалось, что в 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)
, что точно сработает.
Спасибо всем.