什么是读该功能的逻辑是什么?

问题描述 投票:17回答:1

我正在学习关于R的功能和参数,但我有一些问题,了解它的逻辑。

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

h()
# [1] 1 4

我预计错误消息将返回,因为没有b的价值。 dh功能下创建但没有像b = d没有代码分配一个值在函数bh

然而,结果是[1] 1 4

bd是怎样联系?

r function variable-assignment
1个回答
19
投票

函数默认参数值中的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不能在调用环境中找到。

© www.soinside.com 2019 - 2024. All rights reserved.