R: gwidgets: gtext: выровнять текст - PullRequest
1 голос
/ 09 января 2012

Я хотел бы спросить, есть ли способ выровнять текст после того, как мы ввели его в 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 ]

2 голосов
/ 09 января 2012

Нет способа выровнять текст в смысле выравнивания по правому краю / по центру / и т.д. в 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
2 голосов
/ 09 января 2012

Убедитесь, что вы используете моноширинный шрифт.Если нет, то очень и очень трудно выровнять вещи.В моноширинных шрифтах каждый персонаж занимает одинаковое количество места.

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