如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值
Posted
技术标签:
【中文标题】如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值【英文标题】:R get object from global environment from function if object exists in global but use different default if not 【发布时间】:2018-08-16 11:33:24 【问题描述】:这当然是可能的,但我似乎无法找到如何做到这一点:
我想要一个函数输入的默认值,但如果全局环境中存在该变量,则覆盖默认值并从全局环境中获取()一个变量。如果全局环境中不存在,则采用函数的默认值,函数中的任何设置都是顶层并覆盖所有设置。
理想情况下,它会像这个虚构的非工作功能一样工作:
###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)
如果我这样做:
myfunc()
[1] 30
但如果我创建 x 我希望它覆盖函数的默认 x=30 并取而代之的是全局环境值:
x <- 100
myfunc()
[1] 100
但如果我在函数内部定义了 x,我希望它是***的,即覆盖其他所有内容,即使 x 是全局定义的:
x <- 100
myfunc(x=300)
[1] 300
提前致谢!
【问题讨论】:
【参考方案1】:最简单的方法是设置适当的默认参数:
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
【讨论】:
【参考方案2】:您可以修改您的函数以检查x
是否存在于.GlobalEnv
中,如果存在则从那里获取它,否则返回默认值。
myfunc <- function(x = 30)
if ("x" %in% ls(envir = .GlobalEnv))
get("x", envir = .GlobalEnv)
else
x
所以如果"x" %in% ls(envir = .GlobalEnv)
是FALSE
它会返回
myfunc()
[1] 30
如果找到x
,它将返回它。如果x <- 100
:
myfunc()
[1] 100
评论后编辑
如果您想确保仅在 x
未指定为 myfunc
的参数的情况下从全局环境返回 x
,则可以使用 missing()
。如果x
未通过,则返回TRUE
,如果是,则返回FALSE
:
myfunc <- function(x = 30)
if ("x" %in% ls(envir = .GlobalEnv) & missing(x))
get("x", envir = .GlobalEnv)
else
x
所以对于你的例子:
x <- 100
myfunc(x=300)
[1] 300
【讨论】:
谢谢你,但你知道如何做最后一部分吗?如果用户定义远离默认值,请保留 x? IE。 x 谢谢!在函数中,missing() 将仅适用于函数内的环境吗?只是出于好奇,有没有办法让 x=30 在定义的 x 的层次结构中占先例?或者将定义的用户函数 (x=300) 降低到全局定义的变量 (x 设置不同的默认值。都想通了。谢谢!以上是关于如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值的主要内容,如果未能解决你的问题,请参考以下文章