如何使用get()函数?使更高层次的对象可作为局部变量访问

时间:2015-12-25 12:28:17

标签: r

我在下面有一些代码。现在,我想在x语句中发生错误时操纵我的初始顶级tryCatch变量。我阅读了文档,但我无法弄清楚它应该如何使用。

有些问题我无法理解。

这类问题的工作流程是什么? (我应该为x变量定义一个新的环境,并在我的本地函数中想要x时引用这个环境吗?

如何使用get()函数?我想我的任务是需要get()函数,加上超级对齐运算符<<-assign

喜欢的东西。我需要x <<- x[! x %in% get(x, envir = "no idea")]

您可以通过使用有效的雅虎代码指定任何向量来尝试代码,例如LoadData(c('YHOO', 'GOOG'))tryCatch语句用于捕获任何不存在的代码,在这种情况下,我想修改我的初始代码清单(x变量)以不包括此代码名称。因此需要get()操作。

LoadData <- function(x) {

 if(is.atomic(x) != TRUE & is.data.frame(x) != TRUE) stop('x must be either a data.frame or an atomic object')

 if(is.data.frame(x) == TRUE) x <-  as.character(x[,1])


 df.list <- lapply(x, function(x) {

   poss.error <- tryCatch(
    {
      quantmod::getSymbols(x, env = NULL, return.class = 'data.frame')
    },
    error = function(e) {
      message(cat(x, "could not be retrieved"))
      # Get the x variable that was passed to LoadData() and manipulate it. 
      return(e)
    })

}

1 个答案:

答案 0 :(得分:2)

在你的问题中提到的函数调用LoadData(c('YHOO', 'GOOG'))中,参数x不是变量而只是一个值。如果该值首先存储在变量中,例如v,然后函数可以更改此变量的值。 (v是函数外的&#34;全局&#34;名称,x是函数内的名称。) 现在考虑函数调用LoadData(x=v)或简称LoadData(v)。要从函数内部获取变量v,需要做两件事:

  • 存储变量env的环境v
  • 名称,变量v存储在环境env中。

环境env应该是函数LoadData的另一个参数,可能将全局环境作为默认值:

 LoadData <- function(x,env=.GlobalEnv) { ... }

获取传递给参数x的变量名称的技巧是使用函数match.callas.list(match.call())是一个命名列表,as.list(match.call())$x是&#34;符号&#34;传递给参数x,即&#34; v&#34;在我们的例子中。然后

x.name <- as.character(as.list(match.call())$x`)

是传递给参数x的变量的所需名称。 现在,您可以使用env[[x.name]]来更改v的值。 v的值为get(x.name,env),但这与x的值相同。所以get并不是真的需要。

这是一个小例子:

f <- function( x, v, env=.GlobalEnv )
{
  x.name <- as.character(as.list(match.call())$x)

  if ( !is.numeric(x) ) { stop(paste0(x.name," must be numeric")) }

  env[[x.name]] <- x-v
  return(NULL)
}

> x <- 5
> y <- 3
> z <- "abc"
> f(x,1)
NULL
> x
[1] 4
> f(y,2)
NULL
> y
[1] 1
> f(z,3)
Error in f(z, 3) : z must be numeric
> 

如果从另一个函数f调用g来更改局部变量a的值,则必须使用参数env

g <- function()
{
  a <- 10
  print("global environment:")
  print(ls(.GlobalEnv))
  print("local environment:")
  print(ls(environment()))

  print("value of `a` before calling `f`:")
  print(a)

  f(a,1,environment())

  print("value of `a` after calling `f`:")
  print(a)

  return(NULL)
}

> g()
[1] "global environment:"
[1] "f" "g" "x" "y" "z"
[1] "local environment:"
[1] "a"
[1] "value of `a` before calling `f`:"
[1] 10
[1] "value of `a` after calling `f`:"
[1] 9
NULL

如果传递给LoadData的变量始终是同一个变量并存储在全局环境中,LoadData不需要任何参数。然后,您只需使用<<-