Я строю (как я думал) простой цикл, который строит информационный блок с параметрами 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
Спасибо, что уделили время!