这是代码:
mf = function(..., expr) {
expr = substitute(expr)
print(class(expr))
print(str(expr))
expr
}
mf(a = 1, b = 2, expr = {matrix(NA, 4, 4)})
输出:
[1] "{"
length 2 { matrix(NA, 4, 4) }
- attr(*, "srcref")=List of 2
..$ :Class 'srcref' atomic [1:8] 1 25 1 25 25 25 1 1
.. .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x7fbcdbce3860>
..$ :Class 'srcref' atomic [1:8] 1 26 1 41 26 41 1 1
.. .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x7fbcdbce3860>
- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x7fbcdbce3860>
- attr(*, "wholeSrcref")=Class 'srcref' atomic [1:8] 1 0 1 42 0 42 1 1
.. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x7fbcdbce3860>
NULL
{
matrix(NA, 4, 4)
}
显然
substitute(expr)
的结果产生类“{”的东西。这门课到底是什么?为什么是 {matrix(NA, 4, 4)}
长度为 2?这些奇怪的属性是什么意思?
最佳答案
{
是代码块的类。只看类,注意这些之间的区别
mf(a = 1, b = 2, expr = {matrix(NA, 4, 4)})
# [1] "{"
mf(a = 1, b = 2, expr = matrix(NA, 4, 4))
# [1] "call"
一类
{
可以容纳多个语句。 length()
指示 block 中有多少条语句(包括 block 的开头)。例如length(quote({matrix(NA, 4, 4)}))
# [1] 2
length(quote({matrix(NA, 4, 4); matrix(NA,3,3)}))
# [1] 3
length(quote({}))
# [1] 1
属性“srcref”和“srcfile”是R如何跟踪定义函数以尝试提供信息性错误消息的位置。你可以看到
?srcfile
帮助页面了解更多信息。
关于r - R中的 "{"类是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562009/