我在下面有一些代码。现在,我想在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)
})
}
答案 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.call
。 as.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
不需要任何参数。然后,您只需使用<<-
。