r - 为什么 `print.function` 不同意用 `substitute()` 创建的函数体?

标签 r

在 R 中,可以在执行一段代码之前进行“宏替换”。使用这种技术,可以在实际创建函数之前将常量动态嵌入到函数体中,从而避免变量查找:

expr = substitute(function () s, list('s'='ABCDE'))
f    = eval(expr)
f()
# [1] "ABCDE"
environment(f)
# <environment: R_GlobalEnv>
这里的封闭环境是R_GlobalEnv ,其中不包含变量 s完全没有,但该函数仍然可以返回 "ABCDE"正确。这似乎意味着返回的字符串 "ABCDE"确实不是来自变量查找,而是嵌入到函数体中。
但是现在如果你打印函数,你可以看到 s仍然存在,尽管它不在 expr 中:
print(f)
# function () s
print(expr)
# function() "ABCDE"
这里到底发生了什么?

最佳答案

print.function打印 srcref属性而不是实际来源,但

  • useSource=参数可用于指定要使用的实际函数源。它默认为 TRUE,但可以指定为 FALSE。
  • body(f)将显示实际的 body 。
  • srcref 属性可以使用 attr(f, "srcref") <- NULL 删除在这种情况下,print 将显示实际来源。也可以覆盖 srcref 属性。 attr(f, "srcref") <- format(f)之所以有效是因为 format使用实际来源。

  • 这是一个演示。
    expr <- substitute(function () s, list('s'='ABCDE'))
    f <- eval(expr)
    
    f
    ## function () s
    
    print(f)
    ## function () s
    
    print(f, useSource = FALSE)
    ## function () 
    ## "ABCDE"
    
    attr(f, "srcref")
    ## function () s
    
    body(f)
    ## [1] "ABCDE"
    
    format(f)
    ## [1] "function () " "\"ABCDE\""    
    
    f <- eval(expr)
    attr(f, "srcref") <- NULL
    f
    ## function () 
    ## "ABCDE"
    
    f <- eval(expr)
    attr(f, "srcref") <- format(f)
    f
    ## function () 
    ## "ABCDE"
    

    关于r - 为什么 `print.function` 不同意用 `substitute()` 创建的函数体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68519001/

    相关文章:

    r - 使用 "Select * from <table_name>"、 'odbc' 包从 R 创建表时,'DBI' 无法在 Oracle 11g 中工作

    r - 如何使用 data.table 计算 R 中不均匀间隔数据的滚动统计量

    r - 按两列中的值范围匹配数据框中的行

    r - Matlab如何计算欠定系统的解?

    r - 如何在 R 中的 "for loop"循环中转换 "foreach"?

    r - R 中灵活的生存模型

    r - 查找字符串 R 代码中嵌套括号的最大深度

    python - R正则表达式从字符串中提取信息

    r - 使用 R Shiny 进行多元线性回归(SelectInput --> multiple=TRUE)

    php - 扩展 PHP 以与 R 编程语言通信