如果对象存在于全局中,则R从函数中获取来自全局环境的对象,否则使用不同的默认值

Nea*_*sch 11 r function environment-variables

当然这是可能的,但我似乎无法找到如何做到这一点:

我想要一个函数输入的默认值,但是如果它存在于全局环境中,则覆盖默认值和get()一个来自全局环境的变量.如果它在全局环境中不存在,则取该函数的默认值,函数中的任何设置都是顶级并覆盖它们.

理想情况下,它会像这个非工作函数一样工作:

###Does not work, desired example

myfunc <- function(x=30){
if(exists.in.global.env(x)){x <- get(x)}
###Top level is tough
if(x.is.defined.as.function.input=TRUE ????){x <- x.defined.as.input}
}else{ x <- 30} 
return(x)
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

myfunc()
[1] 30
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建x,我希望它覆盖函数的默认x = 30并取代全局环境值:

x <- 100
myfunc()
[1] 100
Run Code Online (Sandbox Code Playgroud)

但是如果我在函数内部定义了x,我希望它是顶级的,即使全局定义x,也要覆盖其他所有内容:

x <- 100
myfunc(x=300)
[1] 300
Run Code Online (Sandbox Code Playgroud)

提前致谢!

cle*_*ens 20

您可以修改函数以检查是否x存在,如果存在则.GlobalEnv从中获取,否则返回默认值.

myfunc <- function(x = 30) {

  if ("x" %in% ls(envir = .GlobalEnv)) {
    get("x", envir = .GlobalEnv)
  } else {
    x
  }

}
Run Code Online (Sandbox Code Playgroud)

所以,如果"x" %in% ls(envir = .GlobalEnv)FALSE它会返回

myfunc()
[1] 30
Run Code Online (Sandbox Code Playgroud)

如果x找到它将返回它.如果x <- 100:

myfunc()
[1] 100
Run Code Online (Sandbox Code Playgroud)

评论后编辑

如果要确保仅从x全局环境返回(如果x未指定为参数)myfunc,则可以使用missing().TRUE如果x没有通过FALSE则返回,如果是:

myfunc <- function(x = 30) {

  if ("x" %in% ls(envir = .GlobalEnv) & missing(x)) {
    get("x", envir = .GlobalEnv)
  } else {
    x
  }

} 
Run Code Online (Sandbox Code Playgroud)

所以对于你的例子:

x <- 100
myfunc(x=300)
[1] 300
Run Code Online (Sandbox Code Playgroud)


Hon*_*Ooi 5

最简单的方法是设置适当的默认参数:

myfunc <- function(x=get("x", globalenv())
{
    x
}

> x <- 100
> f()
[1] 100
> f(30)
[1] 30
> rm(x)
> f()
Error in get("x", globalenv()) : object 'x' not found
Run Code Online (Sandbox Code Playgroud)