在函数中设置条件(ifelse)参数

时间:2014-09-17 06:47:26

标签: r function arguments

我有一个简单的函数,其中一个参数需要在某种意义上成为条件:

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)
}

2 个答案:

答案 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