我有一个简单的函数,其中一个参数需要在某种意义上成为条件:
IFELSE NOT MISSING采用给定的值 IFELSE NOT EXISTS然后给出一些默认值 ELSE给出该参数的全局值
类似的东西:
f <- function(x,y=ifelse(!missing("y"),y,ifelse(!exists("y"),1,get("y",envir=.GlobalEnv))))
{
assign("y",y,envir=.GlobalEnv)
return(x+y)
}
所需产出:
# :f(3) should give me 4 with global y=1
# :f(4,2) should give me 6 with global y=2
# :f(5) should give me 7 with global y=2
#Note that y does not exist when we first run the function
用f(3)运行上面的函数给我: - get中的错误(“y”,envir = .GlobalEnv):找不到对象'y'
如果我在第一步中指定y
,那么该函数可以正常工作,但我希望它能够运行,即使用户没有在第一步中指定y
参数
有什么建议吗?
感谢。
编辑: @Richard我不认为如果missing()在函数或参数中是重要的,在任何情况下尝试使用此函数执行相同的操作:
f <- function(x,y)
{
y=ifelse(!missing("y"),y,ifelse(!exists("y"),1,get("y",envir=.GlobalEnv)))
assign("y",y,envir=.GlobalEnv)
return(x+y)
}
答案 0 :(得分:1)
尝试:
f <- function(x,y=NULL)
{
y = ifelse( !is.null(y), y,
ifelse(!exists("y"), 1,get("y",envir=.GlobalEnv)
)
)
assign("y",y,envir=.GlobalEnv)
return(x+y)
}
如果y不存在,请尝试:
f <- function(x,y)
{
if(missing("y") || !exists('y')) y = 1
assign("y",y,envir=.GlobalEnv)
x+y
}
答案 1 :(得分:1)
首先,我首先要说明我不建议你这样做。你将搞乱重新分配全局对象,这可能是危险的,如果你需要返回并调用你已经覆盖的值,就会导致麻烦。
接下来,missing
不应该在函数的参数列表中使用。它应该在函数体中用于检查参数列表中的参数,并具有帮助文件中记录的特定用法。
那就是说,如果你必须这样做,那就去吧。
f <- function(x, y)
{
if(missing(y)) {
y <- if(exists("y", envir = .GlobalEnv)) {
get("y", envir = .GlobalEnv)
} else {
1L
}
}
assign("y", y, .GlobalEnv)
x + y
}
> rm(y)
> f(3)
#[1] 4
> f(4, 2)
#[1] 6
> f(5)
#[1] 7