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)
最简单的方法是设置适当的默认参数:
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)