【问题标题】:Setting conditional(ifelse) arguments in a function在函数中设置条件(ifelse)参数
【发布时间】: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 概念吸引了我。

标签: r function arguments


【解决方案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
}

【讨论】:

  • @mso f(3)#Error in get("y", envir = .GlobalEnv) : object 'y' not found
  • 此函数也出现与上述相同的错误:f(3)。确保在运行之前从工作区中删除对象 y。目标是如果 y 缺失并且它甚至不存在,则它采用默认值。 => f(3) 应该给出 4 #3+1
  • 您的第二个功能也无法按要求工作。查看我在问题中所需的输出。无论如何,理查德明白了。
【解决方案2】:

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

接下来,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

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2022-12-11
    • 2017-10-05
    相关资源
    最近更新 更多