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

R 在函数中设置条件(ifelse)参数,r,function,arguments,R,Function,Arguments,我有一个简单的函数,它的一个参数需要设置为有条件的,在这个意义上: 如果没有缺失,则取给定值 如果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)运行上述函数会给我带来

我有一个简单的函数,它的一个参数需要设置为有条件的,在这个意义上:

如果没有缺失,则取给定值 如果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)运行上述函数会给我带来:-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)
}
f试试:


f首先,我要声明我不建议您这样做。您将在全局对象的重新分配上乱作一团,如果您需要返回并调用已覆盖的值,这可能会很危险并导致麻烦

接下来,函数的参数列表中不应使用
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
f(3)
#[1] 4
>f(4,2)
#[1] 6
>f(5)
#[1] 7

@mso
f(3)#get(“y”,envir=.GlobalEnv)中的错误:未找到对象“y”
此函数获取的错误与上面提到的错误相同:f(3)。确保在运行对象y之前将其从工作区中删除。目标是,如果y缺失,并且它甚至不存在,则它将采用默认值。=>f(3)应该给出4#3+1你的第二个函数也没有按要求工作。请看问题中我所要求的输出。不管怎么说,richard明白了。我错在哪里了。我在检查函数中是否存在y,以及默认情况下是否存在全局
exists(“y”)
inherits=T。那么,这为什么会失败呢?Ans:如果条件不总是真或假,ifelse将评估是和否条件;因此,当y在任何地方缺失和未定义时,第二个ifelse
!exists(“y”)
为真,它给出y=1,然后
!exists(“y”)
变为FALSE(它确实存在于函数中),并且它计算了
get(“y”,envir=.GlobalEnv)
,由于y在全局环境中不存在,所以给出了错误。因此,将
exists(“y”)
修改为
exists(“y”,envir=.GlobalEnv)
就成功了。多亏了Richard,这个ifelse的概念吸引了我。
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)
}
f <- function(x,y)
{ 
  if(missing("y") || !exists('y'))  y = 1
  assign("y",y,envir=.GlobalEnv)
  x+y
}
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