com*_*sim 5 r object data-structures
我经常向我的同行教授 R,并且解释嵌套数据(例如嵌套列表)的结构可能是一项艰巨的任务,我发现创建视觉辅助工具可以走很长的路。
然而,诸如此类的函数的输出str()包含大量信息,并且不是最易读的格式,因此我尝试将此输出格式化,然后使用 RegEx 获得更易读的输出。我经历了一些警告,并且对字符串操作不是很熟练,我希望我能得到一些帮助。
给定以下对象:
object <- list(
a = 1:5,
b = matrix(c(1, 3, "a", "i"), byrow = TRUE),
l1 = list(
data = data.frame(
x = letters,
y = LETTERS
),
vec = "The river",
l2 = list(
abc = seq(1, 9, by = 2),
col = "#445f43"
)
),
data2 = data.frame(
x = c("a","h"),
y = runif(2, 9, 90)
),
rand = runif(12, 99, 120),
form = y~x^4
)
Run Code Online (Sandbox Code Playgroud)
预期输出将是树渲染:
object
??? a 'int'
??? b 'chr'
??? l1 'list'
? ??? data 'data.frame'
? ? ??? x 'factor'
? ? ??? y 'factor'
? ??? vec 'chr'
? ??? l2 'list'
? ??? abc 'chr'
? ??? col 'chr'
??? data2 'data.frame'
? ??? x 'factor'
? ??? y 'num'
??? rand 'num'
??? form 'formula'
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数来提供这个输出,并添加一些参数来返回列表元素的长度和其他信息,也许还有颜色编码的类。
我过去曾考虑过实施类似的措施,但从未抽出时间去做。在你的问题的提示下,我编写了一个函数,str2它是你所要求的一个简单的实现。我确信它可以得到实质性改进,但这只是一个开始。它的工作原理如下:
> str2(object)\nobject\n\xe2\x94\x82 \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 a \'integer\' \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 b \'matrix\' \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 l1 \'list\' \n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 data \'data.frame\' \n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 x \'character\'\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 y \'character\'\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 vec \'character\' \n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 l2 \'list\' \n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 abc \'numeric\'\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 col \'character\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 data2 \'data.frame\' \n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 x \'character\' \n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 y \'numeric\' \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 rand \'numeric\' \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 form \'formula\' \nRun Code Online (Sandbox Code Playgroud)\n它也处理未命名的列表元素:
\n> str2(list(1:5, list(1, 2)))\nlist(1:5, list(1, 2))\n\xe2\x94\x82 \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 unnamed \'integer\' \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 unnamed \'list\' \n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 unnamed \'numeric\'\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 unnamed \'numeric\'\nRun Code Online (Sandbox Code Playgroud)\n并按预期使用数据框工作:
\n> str2(mtcars)\nmtcars\n\xe2\x94\x82 \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 mpg \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 cyl \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 disp \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 hp \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 drat \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 wt \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 qsec \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 vs \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 am \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 gear \'numeric\'\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 carb \'numeric\'\nRun Code Online (Sandbox Code Playgroud)\n该函数包含 3 个可以组合的递归子函数,以及一些低效的循环,可以稍微小心地进行向量化:
\n> str2(mtcars)\nmtcars\n\xe2\x94\x82 \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 mpg \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 cyl \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 disp \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 hp \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 drat \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 wt \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 qsec \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 vs \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 am \'numeric\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 gear \'numeric\'\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 carb \'numeric\'\nRun Code Online (Sandbox Code Playgroud)\n