在R中,我想测试formula
用户是否在formula
中指定了拦截。目前我正在使用函数terms
。在下列情况下,我得到了所需的输出
terms(y ~ x) #found an intercept
terms(y ~ 1 + x) #found an intercept
terms(y ~ 0 + x) #found no intercept
terms(y ~ -1 + x) #found no intercept
但是在用户提供不一致输入的情况下,我从terms
获得关于截距规范的(imo random)结果。
terms(y ~ -1 + 1 + x) #found an intercept
terms(y ~ 1 - 1 + x) #found no intercept
terms(y ~ 0 + 1 + x) #found an intercept
terms(y ~ 1 + 0 + x) #found no intercept
我真正想要的是terms
在这些情况下抛出错误或警告。这可能是terms
,还是我必须“手动”(通过正则表达式等)对一致性进行此类检查?
答案 0 :(得分:1)
如果公式fo
有截距,则此值为1,否则为
has_intercept <- attr(terms(fo), "intercept")
所以如果有拦截,这将产生错误:
if (has_intercept) stop("Intercept is not allowed")
关于问题中不一致的评论,它的工作方式似乎是它从左到右并使用最后遇到的一个,例如,y ~ 0 + 1 + x
有一个拦截,y ~ 1 + 0 + x
做不
为了保持一致性,通常最好坚持R的规则,而不是制定自己的不同规则。