语言: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)
我希望 |
对齐。目前它们没有对齐;很明显,我没有将列填充到相同的宽度。因此,我使用format
使每一列都具有相同的宽度(稍后我会编写代码自动确定每列的宽度,但现在让我们忽略这个):
df.padded <- apply(df,2,format,width=8)
df.padded.text <- apply( df.padded, 1, paste, collapse=" | ")
menu( df.padded.text,graphics=T )
您看到它还是有点不对吗?但是,如果我查看 df.padded
,我会得到:
> df.padded
a b
[1,] " 9 " "hello "
[2,] "10 " "bananas "
因此,每个单元格肯定都填充到相同的长度。
这样做的原因可能是因为此默认字体(至少在我的系统Linux上)不是等宽字体。
因此,我的问题是:
我能否为menu(..,graphics=T)
函数指定等宽字体?
更新
@RichieCotton注意到,如果您查看具有graphics=T
的menu
,它会调用select.list
,后者又会调用tcltk::tk_select.list
。
因此,看起来我必须修改tcltk
选项。 来自@jverzani:
library(tcltk)
tcl("option", "add", "*Listbox.font", "courier 10")
menu(df.padded.text,graphics=T)
假设menu(...,graphics=T)
在graphics
为TRUE时调用tcltk::tk_select.list
,那么我猜这是一个可行的选项,因为任何能够显示图形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)
,这肯定会起作用。
谢谢大家。
menu
调用select.list
,它会消失在外部代码中。你可能更有运气去修改tcltk::tk_select.list
。 - Richie Cottontcltk
。你知道它是否在所有 R 发行版中都是标准的吗?我只想尽量减少用户需要安装的外部包数量(因为我已经有相当多了)。谢谢。 - mathematical.coffeetcltk
在 Windows 上是标准的,但在 Linux 上不是(对于 OSX 不确定)。您可以使用capabilities("tcltk")
测试支持情况。 - Richie Cottonlibrary(tcltk); tcl("option", "add", "*Listbox.font", "times 16 bold ")
这样的代码可以实现。 - jverzani