假设我编写了一个接受另一个函数作为参数的函数:
fct1 <- function(FUN) {
# If FUN is rnorm, then do this.
# If FUN is rbeta, then do this.
}
我应该如何检查FUN是否为rnorm
?
我知道我可以通过as.list()
将函数转换为列表,然后通过toString()
将其强制转换为字符串:
toString(as.list(rnorm))
结果是:
", 0, 1, .Call(C_rnorm, n, mean, sd)"
然后,我可以查看C_rnorm
的内容。
但我认为这不是一个好的解决方案。我也读过某个地方(我记不清其来源)将一个闭包强制转换为一个列表然后一个字符串可能只是为了向后兼容,并且不鼓励。
我也考虑过body()
。例如,
body(rnorm)
结果是:
.Call(C_rnorm, n, mean, sd)
但是,如何检查呼叫中是否C_rnorm
?我尝试使用as.list()
然后使用toString()
:
toString(as.list(body(rnorm)))
结果如下:
".Call, C_rnorm, n, mean, sd"
然而,这是一个好习惯吗?
答案 0 :(得分:2)
您可以使用match.call
:
fct1 <- function(FUN) {
called <- match.call()$FUN
if(called == "rnorm") {
return("Passed rnorm")
} else {
return("Not rnorm")
}
}
fct1(rnorm)
# [1] "Passed rnorm"
fct1(rlnorm)
# [1] "Not rnorm"