Возврат из функции изменяет выходные значения - PullRequest
0 голосов
/ 21 марта 2019

Я строю (как я думал) простой цикл, который строит информационный блок с параметрами boxcox - лямбда и сдвиг.Казалось, что код работает, но когда я захотел превратить его в функцию, я заметил, что 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 голосов
/ 21 марта 2019

Я не знаю почему, но решение состоит в том, чтобы изменить это:

lm(as.matrix(tmp)~1)

к этому

tmp~1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...