2010-08-10 58 views
7

R中是否有可能保护函数名称(或通常的变量),以便它们不能被屏蔽。R中的保护函数名称

我最近发现,当创建一个名为“new”的数据框时,这可能是一个问题,该数据框掩盖了lmer使用的函数,从而使其停止工作。 (一旦知道问题出在哪里,恢复很容易,这里“rm(新)”就是这样做的。)

+0

数据帧不能覆盖的功能。您可以同时使用两者。 – James 2010-08-11 08:43:07

+0

“覆盖”是错误的词。面具? – AndyF 2010-08-11 14:55:19

+1

重复的http://stackoverflow.com/questions/936748/declaring-a-const-variable-in-r – hadley 2010-08-13 02:00:38

回答

4

也许使用环境!这是区分名称空间的好方法。例如:

> a <- new.env() 
> assign('printer', function(x) print(x), envir=a) 
> get('printer', envir=a)('test!') 
[1] "test!" 
+2

当然,有人可能会覆盖'a':) – geoffjentry 2010-08-11 04:31:05

2

@hdallazuanna建议(via Twitter)

new <- 1 
lockBinding('new', globalenv()) 

这是有意义的,当变量是用户创建的,但不当然,防止从封装覆盖的功能。

6

对于您的问题有一个简单的解决方法,无需担心保护变量名称(尽管使用lockBinding看起来确实很有趣)。如果某个功能被屏蔽,如在您的示例中,在::运营商的帮助下,仍然可以调用屏蔽版本。

通常,语法是packagename::variablename

(如果你想要的功能还没有被从包中导出,那么你就需要三个冒号代替,:::。这不应该在这种情况下,然而适用。)

+0

如果我打电话功能不起作用,在一个依赖其他功能的套件中,无意中被掩盖了。 – AndyF 2010-08-11 14:56:19

+0

@AndyF是的,这是一个很好的观点。我在答案中看到了一个主题:R不保护用户不受他们自己的影响。这非常类似于Linux。 ;) – 2010-08-12 14:29:17