gpt4 book ai didi

r - 在 `menu` 中指定等宽字体

转载 作者:行者123 更新时间:2023-12-03 06:11:23 29 4
gpt4 key购买 nike

语言:R。问题:我可以为 menu(..,graphics=T) 指定固定宽度字体吗?功能?

说明:

我最近问过this question关于如何让用户以交互方式选择数据框的一行:

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

我想要|排队。目前他们还没有这样做;公平地说,我没有将列填充到相同的宽度。所以我用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

看看它怎么仍然不稳定?然而,如果我看 df.padded ,我得到:

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

因此每个单元格肯定会填充到相同的长度。

这样做的原因可能是因为默认字体(无论如何,在我的系统上,Linux)不是固定宽度的。

所以我的问题是:我可以为menu(..,graphics=T)指定固定宽度字体吗功能?

更新

@RichieCotton 注意到,如果你看 menugraphics=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.listgraphics是真的,我的猜测是这是一个可行的选择,因为任何发行版都能够显示图形 menu首先还会有 tcltk就可以了,因为它需要调用 tk_select.list .

(顺便说一句,我在文档中找不到任何可以提示我尝试 tcl('option','add',...) 的内容,更不用说该选项被称为 *Listbox.font !)

另一个更新 - 仔细查看了 select.listmenu代码,结果在 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) ,这肯定会起作用。

谢谢大家。

最佳答案

另一种填充方法:

na.pad <- function(x,len){
x[1:len]
}

makePaddedDataFrame <- function(l,...){
maxlen <- max(sapply(l,length))
data.frame(lapply(l,na.pad,len=maxlen),...)
}

x = c(rep("one",2))
y = c(rep("two",10))
z = c(rep("three",5))

makePaddedDataFrame(list(x=x,y=y,z=z))

na.pad() 函数利用了这样一个事实:如果您尝试索引不存在的元素,R 将自动用 NA 填充向量。

makePlatedDataFrame() 只是找到最长的一个并将其余的填充到匹配的长度。

关于r - 在 `menu` 中指定等宽字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9189197/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com