在数据框打印期间缩写列名称

cou*_*rdz 5 printing mobile r

R 的 abbreviate() 对于将数据帧的列名截断为设定长度非常有用,并通过良好的检查来确保唯一性等:

abbreviate(names(dframe), minlength=2)
Run Code Online (Sandbox Code Playgroud)

当然,可以使用此函数就地缩写列名称,然后打印出更改后的数据框

>>names(dframe) <- abbreviate(names(dframe), minlength=2)
>>dframe
Run Code Online (Sandbox Code Playgroud)

但我想打印出带有缩写列名称的数据框,而不在此过程中更改数据框。希望这可以通过 print() 调用中的简单格式选项来完成,尽管我通过 print.data.frame 等 print 和格式方法的帮助页面进行搜索并没有找到任何明显的解决方案(可用选项似乎更适合格式化列值,而不是它们的名称)。

那么, print() 或 format() 是否有任何在列名上调用 abbreviate() 的选项?如果没有,是否有一种方法可以在将数据帧传递给 print() 之前将 abbreviate() 应用于数据帧的列名称,同样不改变传递的数据帧?

我想得越多,我就越认为唯一的方法是向 print() 传递带有已缩写的列名的数据框的副本。但这对我来说不是一个解决方案,因为我不想在交互式会话期间更新原始版本时不断更新此副本。原始列名称必须保持不变,因为我使用 which(colnames(dframe)=="name_of_column") 与数据交互。

我的最终目标是在使用 Server Auditor 等 ssh 应用程序时,在移动设备的小屏幕上更好地远程工作。如果列名称缩写为仅 2-3 个字符,我仍然可以识别它们,但可以在屏幕上显示更多数据。也许甚至有更适合压缩打印的 R 包?

Ric*_*ven 4

您可以定义自己的打印方法

print.myDF <- function(x, abbr = TRUE, minlength = 2, ...) {
    if (abbr) {
        names(x) <- abbreviate(names(x), minlength = minlength) 
    }
    print.data.frame(x, ...)
}
Run Code Online (Sandbox Code Playgroud)

然后将类添加myDF到数据中并打印

class(iris) <- c("myDF", class(iris))
head(iris, 3)
#   S.L S.W P.L P.W     Sp
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
print(head(iris, 3), abbr = FALSE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
print(head(iris, 3), minlength = 5)
#   Spl.L Spl.W Ptl.L Ptl.W  Specs
# 1   5.1   3.5   1.4   0.2 setosa
# 2   4.9   3.0   1.4   0.2 setosa
# 3   4.7   3.2   1.3   0.2 setosa
Run Code Online (Sandbox Code Playgroud)