如何从函数返回对象,而不是在调用对象时提供的输出?
best.mod <- function(d){
m1 <- lm(Sepal.Length~Sepal.Width, d)
m2 <- lm(Sepal.Length~Sepal.Width + I(Sepal.Width^2), d)
ifelse(AIC(m1) < AIC(m2), m1, m2)
}
mod <- best.mod(iris[iris$Species == "setosa",])
class(mod)
答案 0 :(得分:4)
问题来自于使用ifelse
。这适用于矢量化比较。标准if ... else
在这里更好:
best.mod <- function(d){
m1 <- lm(Sepal.Length~Sepal.Width, d)
m2 <- lm(Sepal.Length~Sepal.Width + I(Sepal.Width^2), d)
if(AIC(m1) < AIC(m2)) return(m1) else return(m2)
}
mod <- best.mod(iris[iris$Species == "setosa",])
class(mod)
[1] "lm"
请注意来自?ifelse
的警告:
结果的模式可能取决于测试的值(参见 例子),以及结果的class属性(参见oldClass) 取自测试,可能不适合从中选择的值 是和否。
答案 1 :(得分:3)
ifelse
并非真正用于此类用途,只需使用if
和else
即可:
best.mod <- function(d){
m1 <- lm(Sepal.Length~Sepal.Width, d)
m2 <- lm(Sepal.Length~Sepal.Width + I(Sepal.Width^2), d)
if(AIC(m1) < AIC(m2)) m1 else m2
}
mod <- best.mod(iris[iris$Species == "setosa",])
class(mod)
ifelse
适用于此类事情:
vec = runif(100)
ifelse(vec < 0.5, NA, vec)