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

时间:2018-03-08 07:27:33

标签: 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)
}

如果我这样做:

myfunc()
[1] 30

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

x <- 100
myfunc()
[1] 100

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

x <- 100
myfunc(x=300)
[1] 300

提前致谢!

2 个答案:

答案 0 :(得分:18)

您可以修改您的函数以检查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未指定x作为myfunc的参数时才从全局环境返回missing(),则可以使用TRUE。如果未通过x则返回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

<start>
<start1>data1</start1>
<start.List>data2</start.List>
</start>

所以对你的例子来说:

[xml]$xmlFile = Get-Content path/to/xmlfile
$xmlFile.start
$xmlfile.start.start1

答案 1 :(得分:3)

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

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