如何在R中输出树状人类可读的对象结构

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)

我想编写一个函数来提供这个输出,并添加一些参数来返回列表元素的长度和其他信息,也许还有颜色编码的类。

编辑:刚刚在这里发现了与我类似的其他问题:和这里

All*_*ron 4

我过去曾考虑过实施类似的措施,但从未抽出时间去做。在你的问题的提示下,我编写了一个函数,str2它是你所要求的一个简单的实现。我确信它可以得到实质性改进,但这只是一个开始。它的工作原理如下:

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