从函数返回一个对象

时间:2013-12-29 10:18:25

标签: r

如何从函数返回对象,而不是在调用对象时提供的输出?

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)

2 个答案:

答案 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并非真正用于此类用途,只需使用ifelse即可:

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)