48

言語: 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 は、それで見ると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)

ここに画像の説明を入力

whenのmenu(...,graphics=T)呼び出しが TRUE であることを考えると、これは実行可能なオプションであると思います。tcltk::tk_select.listgraphicsmenutcltktk_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)、確実に機能します。

皆さんありがとう。

4

2 に答える 2

1

パディングへの別のアプローチ:

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 を自動的に埋め込むという事実を利用します。

makePaddedDataFrame()最も長いものを見つけて、残りを一致する長さまでパディングします。

于 2012-06-12T22:00:32.880 に答える
0

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
 }

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) の文字数の最大長です。データに応じて反映するように変更できます。

于 2012-05-08T03:57:51.720 に答える