1

我想问一下我们在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 控制台。非常感谢,提前

4

2 回答 2

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))对齐每一列。

# 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
于 2012-01-09T01:36:58.060 回答
2

确保使用等宽字体。如果你不这样做,那么就很难对齐。等宽字体的每个字符占用相同数量的空间。

# Instead of
insert(gt3, str.split[[i]])
# Try this
insert(gt3, str.split[[i]], font.attr = c(family="monospace"))
于 2012-01-09T01:16:31.170 回答