4

我需要测试一个公式是否是片面的(例如~ a,而不是a~b)。

现在我正在做这样的事情:

test <- list( ~ a + b, a ~ b + c, b + c ~ a )
isOneSided <- function(form) length(form)==2 && sum(grepl("~",form))==1
> sapply(test,isOneSided)
[1]  TRUE FALSE FALSE

有没有更好的办法?我担心有些我不知道的公式类型可能会逃避这个测试。

4

1 回答 1

6

我将使用该terms函数并提取响应属性:

test <- list( ~ a + b, a ~ b + c, b + c ~ a )
sapply( test , function(x) attr( terms(x) , "response" ) == 0 )
# [1]  TRUE FALSE FALSE

编辑

正如@Arun 指出的那样,在不知道特殊所指的情况下,terms无法扩展具有特殊属性的公式对象。一种解决方法是在函数调用中包含一个虚拟对象:.data.framedata.frameterms

## If we want to expand the '.' in b + c ~ .    
test <- list( ~ a + b, a ~ b + c, b + c ~ a ,  b + c ~ . , . ~ b + c  )
sapply( test , function(x) attr( terms(x , data = data.frame(runif(1))) , "response" ) == 0 )
# [1]  TRUE FALSE FALSE FALSE FALSE
于 2013-05-04T17:16:32.660 回答