2012-06-18 17 views

回答

8

这里的讽刺是你没有不要覆盖它。您创建了一个名为“print”的数据对象,当您在控制台键入print时,eval-print循环接管并返回它。如果您通过输入print("something")print(42)来正确测试打印的行为,您会发现解释器仍然能够在基本NAMESPACE中找到print.default函数。定义与现有函数名称相同的数据对象是不好的做法,不是因为它们在R解释器中被覆盖,而是因为它们覆盖了用户的头脑。解释者通过查看是否存在表示函数调用的开放括号来确定您的意图(好吧,它决定了它会做什么)。如果字母打印后面跟着“(”,那么解释器会查看参数的类并发送相应的打印方法。

3

把它送回从命名空间

print = base::print 
+3

这会在全局环境中产生不必要的'base :: print'副本。删除你创建的'print'对象(如@gsk在他的回答中建议的那样) –

+1

它从来不在基础:NAMESPACE中,它比编程暴力更耗费基础功能。 –

10

rm不会删除的基本对象,所以你可以运行:

rm(print) 

有趣的是,你可以打印件事情:

> print <- FALSE 
> print 
[1] FALSE 
> print("hi") 
[1] "hi" 
> rm(print) 
> print("hi") 
[1] "hi" 
> print 
function (x, ...) 
UseMethod("print") 
<bytecode: 0x2a3a148> 
<environment: namespace:base> 
相关问题