Подтвердить что ты не робот

Как расширить поле Posixct в R str()?

Я пытаюсь расширить количество факторов, показанных в одном настраиваемом поле Posixct, где нормальный путь (str(DF, list.len=ncol(DF), vec.len=20)) не работает. Я запрашиваю здесь 20, но он показывает все время два ("2017-01-01 08:40:00" "2017-01-01 08:50:00" ...) независимо от длины списка (здесь 3). Данные data.csv

"AAA", "BBB"
1, 01012017-0940+0100
2, 01012017-0950+0100
3, 01012017-0838+0100

Код

library('methods') # setClass

# https://unix.stackexchange.com/a/363290/16920
setClass('iso8601')

# https://stackoverflow.com/info/5788117/only-read-limited-number-of-columns
setAs("character","iso8601",function(from) strptime(from,format="%d%m%Y-%H%M%z"))

DF <- read.csv(file='data.csv',
        sep=',',
        header=TRUE,
        colClasses=c('numeric','iso8601'),
        strip.white=TRUE)

DF

str(DF, list.len=ncol(DF), vec.len=20)

Выход в R 3.3.3

 AAA                 BBB
1  1 2017-01-01 08:40:00
2  2 2017-01-01 08:50:00
3  3 2017-01-01 07:38:00
'data.frame':  3 obs. of  2 variables:
 $ AAA : num  1 2 3
 $ BBB : POSIXlt, format: "2017-01-01 08:40:00" "2017-01-01 08:50:00" ...

Выход в R 3.4.0

То же, что и выше, воспроизводя ту же проблему.

  AAA                 BBB
1   1 2017-01-01 08:40:00
2   2 2017-01-01 08:50:00
3   3 2017-01-01 07:38:00
'data.frame':   3 obs. of  2 variables:
 $ AAA: num  1 2 3
 $ BBB: POSIXlt, format: "2017-01-01 08:40:00" "2017-01-01 08:50:00" ...
  • Как вы можете расширить str(DF, list.len=ncol(DF), vec.len=20) на множество факторов на переменную?

  • Как вы можете показать количество элементов на переменную в str(DF)? Etc без расширения самих параметров в переменной.

Исключить ширину и коэффициент столбца в этиологии

Я сделал

  • увеличено значение по умолчанию: ширина от 80 до 150, а столбцы от 24 до 38
  • перезапустил приглашение терминала
  • run Rscript myScript.r
  • Выведите то же самое, так что ширина терминала и количество столбцов здесь не играют здесь.

Предложение Roland

Код не работает во всех случаях, но в ограниченном числе случаев, поэтому его можно применять динамически

# Roland comment
str(DF, list.len=ncol(DF), vec.len=20, width = 100)

R: 3.3.3, 3.4.0 (2017-04-21, backports)
ОС: Debian 8.7
Менеджер окон: Gnome 3.14.1

4b9b3361

Ответ 1

Ширина предложения

Чтобы добиться "более широкого" вывода, вы можете изменить значение по умолчанию width в R options.

Согласно options {base} help:

ширина:

управляет максимальным количеством столбцов в строке, используемой для печати векторов, матриц и массивов, а также при заполнении cat.

Here is an example:
# initial try
str(DF, list.len=ncol(DF), vec.len=20)

он дает:

    'data.frame':   3 obs. of  2 variables:
 $ AAA: num  1 2 3
 $ BBB: POSIXlt, format: "2017-01-01 11:40:00" "2017-01-01 11:50:00" ...

Параметры предложения (ширина)

И теперь, с разными width:

# retain default options
op <- options()

# set apropriate width
n_cols <- 22 * 20 # n columns for 20 POSIXlt strings
n_cols <- n_cols + 50 # 50 columns for column description
# actually you can use any sufficiently big number
# for example n_cols = 1000
options(width = n_cols)
str(DF, list.len=ncol(DF), vec.len=20)
options(op)

Результат:

'data.frame':   3 obs. of  2 variables:
 $ AAA: num  1 2 3
 $ BBB: POSIXlt, format: "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00"

Параметр ширины Roland

Похоже, вы можете достичь этого, а также с параметром width в str. Так же, как предложил Роланд. Но снова вам нужно предоставить достаточно большое значение для вывода. 1 Строка POSIXlt содержит 21 символ + пробел. Итак, для 20 строк вам нужно больше 440 столбцов.

Трехпараметрический подход

Я попробовал это с вашим примером:

DF <- rbind(DF, DF, DF) # nrows = 24

# Calculate string width
string_size <- nchar(as.character(DF[1, 2])) + 3 # string width + "" and \w
N <- 20 # number of items
n_cols <- string_size * N

str(DF, list.len=ncol(DF), vec.len=20, width = n_cols)

Вывод:

'data.frame':   24 obs. of  2 variables:
 $ AAA: num  1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
 $ BBB: POSIXlt, format: "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" ...

Существует ровно 20 строк POSIXlt.

Описание

Проблема с выходом возникает из метода utils:::str.POSIXt, который вызывается для объекта POSIXlt. Интересная часть находится в следующей строке:

larg[["vec.len"]] <- min(larg[["vec.len"]], (larg[["width"]] - 
                nchar(larg[["indent.str"]]) - 31)%/%19)

Эта строка вычисляет количество строк POSIXlt в выводе. Грубо говоря, вывод будет состоять не более чем из vec.len строк POSIXlt И длина вывода в символах будет не более width.

Здесь larg - это список аргументов, переданных в str. По умолчанию они: vec.len = 4; width = 80; indent.str = " ".

Таким образом, рекоммутированный vec.len по умолчанию будет равен 2.

Как в последнем примере, мы устанавливаем vec.len = 20, width = 440, а наш фрейм данных имеет 24 строки. Пересчитанный vec.length равен 20. Таким образом, вывод str(DF) содержит 20 строк POSIXlt и привязан к "...", что означает, что в векторе POSIXlt содержится более 20 элементов.