获取任何 R 对象的字符串表示形式

Ste*_*ini 0 string r

我希望能够获得任何 R 对象的字符串表示形式(而不是打印)。在Python中,我会得到这样的东西

>>> class Foo():
...     pass
... 
>>> f = Foo()
>>> print(f)
<__main__.Foo object at 0x10dab0910>
>>> x=str(f)
>>> x
'<__main__.Foo object at 0x10dab0910>'
>>> a = {1, 2,3 }
>>> str(a)
'{1, 2, 3}'
>>> str(str)
"<class 'str'>"
>>> str(foo)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> 
KeyboardInterrupt
>>> def foo(): pass
... 
>>> str(foo)
'<function foo at 0x10dab1170>'
Run Code Online (Sandbox Code Playgroud)

在 R 中,我尝试了以下操作(以斜体引用帮助文本):

  • as.character():如果我传递一个向量,我期望一个包含向量的字符串,而不是字符串向量,所以as.character不是我想要的。

  • str()不返回任何内容”,它只是打印它:

    a <- str(str)
    # function (object, ...)  
    a
    # NULL
    
    Run Code Online (Sandbox Code Playgroud)

我不想依赖,capture.output因为我希望避免通过标准输出来获取此信息。

  • toString()返回长度为 1 的字符向量”,即不是我需要的,例如应用于 a 时data.frame

    toString(cars)
    # [1] "c(4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12
    
    Run Code Online (Sandbox Code Playgroud)
  • 出于与(见上文)相同的原因, 的功能print()不能满足我的需求str()。另外,如果实体是可以渲染的东西,它将触发渲染而不是字符串表示。

  • cat()目前仅处理原子向量和名称”。因此,cat将出现以下错误data.frame

    cat(cars)
    # Error in cat(cars) : argument 1 (type 'list') cannot be handled by 'cat'
    
    Run Code Online (Sandbox Code Playgroud)

use*_*330 5

使用deparse()。例如,

deparse(cars)
#> [1] "structure(list(speed = c(4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, "                          
#> [2] "12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, "                         
#> [3] "16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, "                         
#> [4] "22, 23, 24, 24, 24, 24, 25), dist = c(2, 10, 4, 22, 16, 10, 18, "                         
#> [5] "26, 34, 17, 28, 14, 20, 24, 28, 26, 34, 34, 46, 26, 36, 60, 80, "                         
#> [6] "20, 26, 54, 32, 40, 32, 40, 50, 42, 56, 76, 84, 36, 46, 68, 32, "                         
#> [7] "48, 52, 56, 64, 66, 54, 70, 92, 93, 120, 85)), class = \"data.frame\", row.names = c(NA, "
#> [8] "-50L))"
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2020-07-24 创建

对于大多数对象,您可以解析和评估输出并获得与原始对象类似的对象。