r - R中此功能的逻辑是什么?

标签 r function variable-assignment

我正在研究R函数中的参数,但是在理解它的逻辑时遇到了一些问题。

h <- function(a = 1, b = d){
    d <- (a + 1)^2
    c(a, b)
}

h()
# [1] 1 4


我希望错误消息会返回,因为没有b的值。
d是在h函数下创建的,但是没有像b = d这样的代码在函数b中为h分配值。

但是,结果是[1] 1 4

bd如何链接?

最佳答案

默认函数参数值在R中是惰性计算的(即仅在需要时才计算):

有关示例,请参见此代码的输出:

printme <- function(name,x){cat('evaluating',name,'\n');x}

h <- function(a = printme('a',1), b = printme('b',d)){
  cat('computing d...\n')
  d <- (a + 1)^2
  cat('d computed\n')
  cat('concatenating a and b...\n')
  c(a, b)
  cat('a and b concatenated\n')
}

h()


控制台输出:

computing d...
evaluating a 
d computed
concatenating a and b...
evaluating b 
a and b concatenated


如您所见,d是在评估b的默认值之前计算的

编辑:

此外,正如@BrodieG在注释中正确指出的那样,默认参数在函数环境中求值;实际上,在上面的示例中,可以将b初始化为在函数环境中定义的变量d的值。

相反,当您指定一个参数(不使用默认值)时,仍会延迟计算分配该参数的表达式,但这一次是在调用环境中,例如:

# same functions as above, but this time we specify the parameters in the call     
h(a=printme('a',123),b=printme('d',d))


控制台输出:

computing d...
evaluating a 
d computed
concatenating a and b...
evaluating d 
Error in printme("d", d) : object 'd' not found


请注意在评估参数b时的错误,因为在调用环境中找不到d

关于r - R中此功能的逻辑是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54568785/

相关文章:

r - dbutils.fs.mount() 适用于 Python,但不适用于 R?

json - 从 R 中的字典列表中提取数据

node.js - 如何使用 github 部署 firebase 函数

C++ 编译错误 - ‘operator=’ 不匹配

c++ - 重载运算符 =

r - for循环中的变量赋值

当行不消失时删除 data.frame 中的所有空列和行

r - 为什么多边形功能存在微小差距?

excel - 如何从三个变量构建复值?

php - 获取 JSON 以打印空数组。