如何在R str()中扩展Posixct字段?

Léo*_* 준영 12 r posixct

我正在尝试扩展一个自定义Posixct字段中显示的因子数量,其中normal way(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
Run Code Online (Sandbox Code Playgroud)

library('methods') # setClass

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

# https://stackoverflow.com/questions/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)
Run Code Online (Sandbox Code Playgroud)

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" ...
Run Code Online (Sandbox Code Playgroud)

输出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" ...
Run Code Online (Sandbox Code Playgroud)
  1. 如何扩展str(DF, list.len=ncol(DF), vec.len=20)每个变量的多个因子?

  2. 如何显示每个变量的项目数量str(DF)?等等,在变量中没有参数本身的扩展.

消除病因中的终端宽度和柱因子

我做到了

  1. 增加了默认值:宽度从80到150,列从24到38
  2. 重启终端提示
  3. Rscript myScript.r
  4. 再次输出相同,因此端子宽度和列数量似乎不起作用

罗兰的提议

代码在所有情况下都不起作用,但在有限数量的情况下,因此应该可以动态地应用它

# Roland's comment
str(DF, list.len=ncol(DF), vec.len=20, width = 100)
Run Code Online (Sandbox Code Playgroud)

R:3.3.3,3.4.0(2017-04-21,backports)
操作系统:Debian 8.7
窗口管理器:Gnome 3.14.1

Ist*_*rel 1

提案宽度

为了实现“更广泛”的输出,您可以更改widthR 中的默认值options

根据options {base}帮助:

宽度:

控制打印向量、矩阵和数组以及通过 cat 填充时使用的行上的最大列数。

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

它给:

    '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" ...
Run Code Online (Sandbox Code Playgroud)

提案选项(宽度)

现在,有了不同的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)
Run Code Online (Sandbox Code Playgroud)

结果是:

'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"
Run Code Online (Sandbox Code Playgroud)

罗兰的宽度参数

看来你也可以通过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)
Run Code Online (Sandbox Code Playgroud)

输出:

'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" ...
Run Code Online (Sandbox Code Playgroud)

正好有 20 个 POSIXlt 字符串。

解释

输出问题是由utils:::str.POSIXtPOSIXlt 对象调用的方法引起的。有趣的部分在下一行:

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

此行计算输出中 POSIXlt 字符串的数量。粗略地说,输出将包含不超过vec.lenPOSIXlt 字符串,并且输出的字符长度不超过width

这里larg是传递给 的参数列表str。默认情况下它们是: vec.len = 4; width = 80; indent.str = " "

因此,重新计算vec.len的默认值为 2。

对于最后一个例子,我们设置vec.len = 20width = 440我们的数据框有 24 行。重新计算vec.length为 20。因此输出str(DF)包含 20 个 POSIXlt 字符串,并以“...”结尾,这意味着 POSIXlt 向量中有超过 20 个元素。