2015-10-07 69 views
3

这工作调用`〜`与前缀约定

lm(mpg ~ cyl, mtcars) 

那么,这是否:

lm(`~`(mpg, cyl), mtcars) 

但这并不:

lm(base::`~`(mpg, cyl), mtcars) 
Error in terms.formula(formula, data = data) : 
    argument is not a valid model 

为什么第三种情况会失败?

回答

4

看来问题源于terms()函数。您从

terms(base::`~`(mpg,cyl)) 

得到同样的错误,可以追溯到它确实

tildeSymbol = install("~"); 

if (!isLanguage(CAR(args)) || 
CAR(CAR(args)) != tildeSymbol || 
(length(CAR(args)) != 2 && length(CAR(args)) != 3)) 
error(_("argument is not a valid model")); 

所以它的字面寻找~,而不是一个~与命名空间为前缀的C source for that functionCAR功能在这种情况下的行为有这样的

quote(`~`(mpg,cyl))[[1]] 
# `~` 
quote(base::`~`(mpg,cyl))[[1]] 
# base::`~`