回复 第9楼 的 yanlinlin82:看了你的解释我觉得我说错了,主要是找函数sum的时候,并不会先去"namespace:base"找,而是从调用的环境globalenv()开始往后找,会找到绑定sum的名字空间"package:base"
对你的解释,我稍微总结下,说错了,请改正啊[s:11]:
对最开始的1楼问题的理解,首先得意识到一个环境中只能有1个名字的存在,这是理解这个问题的核心,OK,那下面就会出现由于不同环境中名字相同带来的名字mask.
其次得意识到找名字的方式,那就是沿着serch() path 中的环境挨个往后找(这也是我之前说错的关键)
最后,大家得找到R中名字绑定的概念,我得先解释一下:
a<-1<br />
a<-2<br />
a<-function(){}<br />
a<-3
通过上面这样的定义,发生了什么? 要注意真正的对象,是1,2,function() {},3而a只是个名字,结合R的垃圾收集机制就是,a绑到1再绑到2,那么1这个int会被释放掉,下面同理,对于函数对象也一样,当定义a是个函数然后又a被绑定到3那么那个函数对象function() {}如果没有被绑定到其他名字就会被删除</p>
所以问题的解释就是:
我们通常自己自定义,就像LZ的方式,都基本定义在同一个环境,globalenv()(或者叫".GlobalEnv")环境中,那么同一个名字会绑定对象的时候,谁后,那么先前的对象就会被垃圾收集掉,不存在了.
而对于R的内建函数,或者说存在于其他包(被library)的函数,当我们无论在".GlobalEnv"环境中干了什么,定义同名变量也好,同名函数也好,因为它们 本身不在一个环境,所以发生的只是mask,所以如果我们在全局定义的是变量,但用那个变量当函数调用的时候,R发现需要一个函数对象,而当前.GlobalEnv环境中的名字绑定的不是函数对象,于是就沿着search() path 中的环境挨个找那个名字的函数对象,直到找到,当定义的是函数对象,发生的是函数调用,那就直接用.GlobalEnv中我们定义的那个绑定到函数对象的名字了!
解释完毕!!