如果对象存在于全局中,则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 &lt;- 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从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值的主要内容,如果未能解决你的问题,请参考以下文章

获取在 R 的全局环境中加载的函数列表 [重复]

用户定义函数将多个数据框导出到全局环境中

要求 r 函数在全局环境中使用对象而不是对象的副本

R编辑在父环境中定义的全局对象

JavaScript中两种类型的全局对象/函数

r 用于从R中的全局环境中删除项目的函数