我实际上有两个问题,这两个问题都是由于缺乏理解R函数中的参数如何处理而产生的。
我想得到一个向量,指示函数f(x,y)
的哪些参数实际上缺失。是否有比以下解决方案更优雅的方式:
f <- function(x, y) {
c(missing(x), missing(y))
}
我还实现了一个函数,它返回一个逻辑变量,指示参数是否为NULL
:
g <- function(x, y) {
args_names <- as.list(environment())
sapply(args_names, is.null)
}
虽然这个函数按预期工作,但我很难理解为什么g(y=1)
没有为第一个参数返回TRUE
:
> g(y=1)
x y
FALSE FALSE
答案 0 :(得分:2)
这似乎是一件合理的事情。当然,如果你有更多的论点,你可以考虑sapply
对于你的第二个问题,为什么不直接返回args并查看
R> g <- function(x, y) {
+ as.list(environment())
+ }
R> args = g(10)
R> str(args$y)
symbol
当然,接下来的问题是什么是符号,取自manual of all knowledge
符号是指R对象。任何R对象的名称通常是a 符号。可以通过函数as.name和。创建符号 引用。符号具有模式“名称”,存储模式“符号”和类型 “符号”。它们可以使用强制进出字符串 as.character和as.name。它们自然地表现为解析的原子 表达式,尝试例如as.list(quote(x + y))。
答案 1 :(得分:2)
使用sapply
,你可以这样做(希望没有太多的小猫被杀死:
f1 <- function(x,y) {
sapply(names(formals()), function(arg) {
eval.parent(call('missing', as.name(arg)), n=3)
})
}