【发布时间】:2014-11-11 02:27:44
【问题描述】:
我有一个简单的函数,它的一个参数需要有条件,从某种意义上说:
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'
如果我在 first-go 中指定 y,则该函数可以完美运行,但即使用户未在 first-go 中指定 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)
}
【问题讨论】:
-
知道我哪里出错了。我正在检查函数内部是否存在 y 以及默认情况下全局
exists("y")inherits=T。那么为什么会失败? Ans:如果条件不总是 TRUE 或 FALSE,ifelse 会同时评估是和否条件;因此,当 y 在任何地方丢失且未定义时,第二个 ifelse!exists("y")为 TRUE,它给出 y=1,然后!exists("y")变为 FALSE(因为 y 它确实存在于函数中)并评估了get("y", envir = .GlobalEnv),它给出了错误因为你不存在于全球环境中。 -
因此将
exists("y")修改为exists("y",envir=.GlobalEnv)就成功了。多亏了 Richard,这个 ifelse 概念吸引了我。