mat*_*fee 48 r fixed-width monospace
语言: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)
Run Code Online (Sandbox Code Playgroud)

我想|排队.他们现在不在; 很公平,我没有填充相同宽度的列.所以我format用来使每一列都达到相同的宽度(稍后我会编写代码来自动确定每列的宽度,但是现在让我们忽略它):
df.padded <- apply(df,2,format,width=8)
df.padded.text <- apply( df.padded, 1, paste, collapse=" | ")
menu( df.padded.text,graphics=T )
Run Code Online (Sandbox Code Playgroud)

看看它如何仍然不稳定?然而,如果我看一下df.padded,我得到:
> df.padded
a b
[1,] " 9 " "hello "
[2,] "10 " "bananas "
Run Code Online (Sandbox Code Playgroud)
所以每个单元格肯定都填充到相同的长度.
原因可能是因为它的默认字体(在我的系统上,无论如何,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)
Run Code Online (Sandbox Code Playgroud)

鉴于menu(...,graphics=T)调用tcltk::tk_select.list何时graphics为TRUE,我的猜测是这是一个可行的选项,因为任何能够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::tk_select.list明确使用menu(...,graphics=T)至少得到一个图形界面(不会是等宽的,但总比没有好)menu(...,graphics=F),这肯定会奏效.谢谢大家.
我不明白为什么你不想使用 View(df) (获取 rowid,将内容放入临时数据框中并使用 View 命令显示它)
编辑:好吧,只需使用sprintf命令
创建一个函数 f 以从数据框对象中提取字符串
f <- function(x,sep1) {
sep1=format(sep1,width=8)
xa<-gsub(" ","",as.character(x[1]))
a1 <- nchar(xa)
xa=format(xa,width=8)
xb=gsub(" ","",as.character(x[2]))
b1 <- nchar(xb)
xb=format(xb,width=8)
format1=paste("%-",10-a1,"s%s%-",20-b1,"s",sep="")
concat=sprintf(format1,xa,sep1,xb)
concat
}
Run Code Online (Sandbox Code Playgroud)
df <- data.frame(a=c(9,10),b=c('hello','bananas'))
df.text <- apply( df, 1, f,sep1="|")
menu(df.text,graphics=T)
当然,sprintf 10、20 中使用的限制是数据帧列 (a,b) 中字符数的最大长度。您可以更改它以根据您的数据反映它。
| 归档时间: |
|
| 查看次数: |
1430 次 |
| 最近记录: |