r - R中的 "{"类是什么?

标签 r expression

这是代码:

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/

相关文章:

java - 如何访问 Strtus2 OGNL 表达式中的多个操作属性?

c# - 在 C# 中,Expression API 是否比 Reflection 更好

c# - 修改 Entity Framework 的表达式树,尽可能接近 T-SQL translation\execution

r - 从函数返回多个值

r - 使用 purrr 和 map (tidyverse) 迭代因变量

r - chron 包中缺少函数

r - 如何计算R中k均值聚类的BIC

R foreach %dopar% : export results to main R process

Java 8 : How Lambda expression impacts

Javascript表达式短缺: value?值:'100'