假设我有这两个功能:
fInner<-function()
{
# Do some complicated stuff, and...
I<<-I+1
}
fOuter<-function()
{
I<-0
fInner()
print(I)
}
调用fOuter()
会产生错误:Error in fInner() : object 'I' not found
。我知道,修复它的一种方法是将示例重写为
fOuter<-function()
{
fInner<-function()
{
I<<-I+1
}
I<-0
fInner()
print(I)
}
但是,如果我不想以这种方式嵌套功能呢?在我的情况下fInner
是一个非常繁重和复杂的函数(我可能想要进入我的库),而fOuter
实际上是一个特定的创建函数,它定义了一个迭代器。我的代码中将有许多fOuter
- 类函数,因此嵌套它们需要在每一个小的迭代器定义中复制fInner
。
我怀疑解决方案与环境有关,但我不知道该怎么做。有人可以帮忙吗?
答案 0 :(得分:3)
您需要访问与fOuter
功能相关联的环境 - 调用fInner
的位置。您可以使用parent.frame
获取此内容,并且可以使用get
和assign
来获取和设置变量:
fInner<-function()
{
assign("I", get("I", envir=parent.frame()) + 1, envir=parent.frame())
}
fOuter<-function()
{
I<-0
fInner()
print(I)
}
有关详细信息,请参阅?environment
和?parent.frame
。
但这只是为了满足您的好奇心!你似乎同意这不是一个好主意。操纵环境和名称很快就会变得复杂,除非你做的事情非常复杂,否则可能有更好的方法。