我们有一个需要多个参数的函数,没有任何参数的默认值。但是,即使未指定其中某些参数,该函数也会返回一个值,如果这些参数仅用于子集矩阵(可能还有其他类型)。我们很困惑为什么会这样 - 有人可以帮忙吗?
具体来说,为什么以下代码不会返回错误,而是对整个矩阵求和并忽略j
:
foo <- function(mat, j){
v <- sum(mat[,j])
v
}
foo(mat = matrix(1:4,3,4))
答案 0 :(得分:4)
根据this blog,函数内部缺少没有默认值的可选参数。对其进行测试会返回TRUE
。
foo <- function(mat, j){
v <- sum(mat[,j]); print(missing(j))
v
}
foo(mat = matrix(1:4,3,4))
[1] TRUE
[1] 30
在不知道具体细节的情况下,我尝试了sum
一点,这就是它所显示的内容。
sum(matrix(1:4,3,4)[,NA])
[1] NA
sum(matrix(1:4,3,4)[,NULL])
[1] 0
sum(matrix(1:4,3,4)[,])
[1] 30
如果我们没有为矩阵指定任何索引,sum
将其所有值相加。
通过阅读博客和小实验,我认为您的自定义函数适用于已使用的函数进程提供数据并且能够使用缺少的参数进行操作的情况。在对矩阵进行子集化的情况下,子集缺少参数的行为是该函数对整个数据集执行操作。
答案 1 :(得分:2)
我猜这个论点永远不会被评估。
foo <- function(x)
bar(x)
bar <- function(y)
missing(y)
foo()
#[1] TRUE
foo(43)
#[1] FALSE
内部函数(在您的情况下为[
,具有正式参数i, j, ..., drop = FALSE
),很可能会检查参数j
是否缺失,如果缺少参数{1}}则不会试着评估它。
答案 2 :(得分:0)
除了@nya回答:
您可以通过在函数内部插入if
语句来避免此行为,该语句在调用函数时评估是否提供了j
的值。如果未提供任何值,则该函数将引发错误:
foo <- function(mat, j){
if(missing(j)){ # Check if argument for j has been supplied
error("j is not inserted")
} else{
v <- sum(mat[,j])
return(v)
}
}