R:gwidgets:gtext:对齐文本

时间:2012-01-09 00:34:09

标签: r gwidgets

我想问一下,在我们在gtext中输入文本之后是否有办法对齐文本。 例如

x <- c(123.4, 5.6)
y <- c(1.2, 3.657)
z <- c(12345.6, 789.4)

df <- data.frame(x, y, z)

df.co <- capture.output(df) # get df as text

for (i in 1:length(df.co))
{
    str.split <- strsplit(df.co, "\\s+") # split every line in its components
}

w3 <- gwindow()
gt3 <- gtext(container=w3)

for (i in 1:length(str.split)) # length(str.split)=3
{
for (j in 1:length(str.split[[i]])) # length(str.split[[i]])=2
    {
        str.split[[i]][[j]] <- paste(str.split[[i]][[j]],"\t",sep="",collapse="")  # add tab to each component
    }
    str.split[[i]] <- paste(str.split[[i]], sep="", collapse="") # join to one line
    insert(gt3, str.split[[i]])
}

这样我们就可以模仿R控制台了。 非常感谢你,提前

2 个答案:

答案 0 :(得分:2)

确保使用等宽字体。如果你不这样做那么对齐事情是非常困难的。等宽字体使每个角色占用相同的空间。

# Instead of
insert(gt3, str.split[[i]])
# Try this
insert(gt3, str.split[[i]], font.attr = c(family="monospace"))

答案 1 :(得分:2)

gWidgets中没有办法在右对齐/中心/等意义上对齐文本。

我推荐使用@Dason建议的等宽字体(虽然这似乎是我的默认设置)。

就您的代码而言,您可以将其清理一下:

  • 你不需要创建str.split的循环(没有任何依赖 i并且您每次都在撰写str.split
  • 您可以消除用于将标签置于str.split[[i]]
  • 中的循环
  • 您无需单独添加str.split的每一行,您可以一次性完成。

总结:

x <- c(123.4, 5.6)
y <- c(1.2, 3.657)
z <- c(12345.6, 789.4)

df <- data.frame(x, y, z)

df.co <- capture.output(df) # get df as text

# @@ don't need loop
str.split <- strsplit(df.co, "\\s+") # split every line in its components

w3 <- gwindow()
gt3 <- gtext(container=w3)

# @@ collapse each str.split[[i]] by joining with '\t'.
str.joined <- sapply(str.split,function(bits) paste(bits,collapse='\t'))
insert(gt3,str.joined)

或者,您可以在df.co <- capture.output(df)之后将所有内容替换为:

insert(gt3,df.co)

(两个并排并进行比较:insert(gt3,df.co)右对齐数据框的每一列,与输入df所显示的完全相同;您拥有的方法(insert(gt3,str.joined) left - 对齐每一列。

# insert(gt3,str.joined)/method in your question
    x       y       z   
1   123.4   1.200   12345.6
2   5.6     3.657   789.4

# insert(gt3,df.co)
      x     y       z
1 123.4 1.200 12345.6
2   5.6 3.657   789.4