从函数返回正在更改输出值

时间:2019-03-20 22:52:04

标签: r

我正在构建(我想是)一个简单的循环,该循环构建boxcox参数(lambda和shift)的数据框。该代码似乎可以正常工作,但是当我想将其转换为函数时,我注意到R正在复制我的输出值。

下面的可复制代码,希望有更多知识的人可以解释这种非常混乱的行为。

#Just running the code
library(MASS)
x <- iris[,-5]
bc_ref <- data.frame(var = character(),
                     pwr = numeric(),
                     shift = numeric())
for(i in 1:ncol(x)){
  tmp <- x[,i]
  orig <- colnames(x)[i]
  if(min(tmp) < 0){
    tmp <- tmp + abs(min(tmp)*1.1)
    shift <- abs(min(tmp))
  }
  bcMod <- boxcox(lm(as.matrix(tmp)~1), 
                  lambda = seq(-2.01, 2.01, 1/10),
                  plotit = F)

  lambda <- bcMod$x[which.max(bcMod$y)]
  if(lambda == 0){
    stop("Error, lambda is 0")
  }
  bc_row <- data.frame(var = paste0("bc.",orig),
                       pwr = signif(lambda),
                       shift = ifelse(
                         exists("shift"), 
                         shift, 
                         NA))
  bc_ref <- rbind(bc_ref, bc_row)
  if(exists("shift")){
    rm(shift)
  }
} #End loop 

#bc_ref
              var   pwr shift
1 bc.Sepal.Length -0.11    NA
2  bc.Sepal.Width  0.29    NA
3 bc.Petal.Length  0.89    NA
4  bc.Petal.Width  0.69    NA

以上是该函数的工作方式,下面显示了与函数完全相同的代码。突然输出改变了!

bc_ref $ pwr中的最后一个值重复。为什么只有那一列?我真的很难理解为什么会这样。

fxn <- function(x){

  bc_ref <- data.frame(var = character(),
                       pwr = numeric(),
                       shift = numeric())
  for(i in 1:ncol(x)){
    tmp <- x[,i]
    orig <- colnames(x)[i]
    if(min(tmp) < 0){
      tmp <- tmp + abs(min(tmp)*1.1)
      shift <- abs(min(tmp))
    }
    bcMod <- boxcox(lm(as.matrix(tmp)~1), 
                    lambda = seq(-2.01, 2.01, 1/10),
                    plotit = F)

    lambda <- bcMod$x[which.max(bcMod$y)]
    if(lambda == 0){
      stop("Error, lambda is 0")
    }
    bc_row <- data.frame(var = paste0("bc.",orig),
                         pwr = signif(lambda),
                         shift = ifelse(
                           exists("shift"), 
                           shift, 
                           NA))
    bc_ref <- rbind(bc_ref, bc_row)
    if(exists("shift")){
      rm(shift)
    }
  } #End loop
  return(bc_ref)
}
#fxn(x)
              var  pwr shift
1 bc.Sepal.Length 0.69    NA
2  bc.Sepal.Width 0.69    NA
3 bc.Petal.Length 0.69    NA
4  bc.Petal.Width 0.69    NA

谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

我不知道为什么,但是解决方案是更改此内容:

lm(as.matrix(tmp)~1)

对此

tmp~1