Причина, по которой quickly
не может вернуть результаты присваиваний столбцам df
, является особенностью R for
-l oop. Возвращает NULL. И последняя функция, которая была оценена в вашей quicky
функции, была for
. Поэтому все, что вам нужно сделать, это добавить вызов к значению df
вне l oop:
quicky <- function(df, factors){
output <- as.character(substitute(factors)[-1])
print(output)
df[,output]
for(i in names(df[,output])){
hist(df[,as.character(i)])
df[, i] <- as.factor(df[, i ])
}; df # add a call to evaluate `df`
}
str( quicky(mtcars, c(cyl,hp,drat)) )
#-------
[1] "cyl" "hp" "drat"
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
$ disp: num 160 160 108 258 360 ...
$ hp : Factor w/ 22 levels "52","62","65",..: 11 11 6 11 15 9 20 2 7 13 ...
$ drat: Factor w/ 22 levels "2.76","2.93",..: 16 16 15 5 6 1 7 11 17 17 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ..
Это поведение for
отличается от большинства других функций в R. При for-l oop оценки и назначения, выполненные в нем, обычно вступают в силу вне тела for
-l oop, то есть в вызывающей среде, но сам вызов функции возвращает NULL. Большинство других функций не имеют никакого эффекта вне их сред тела функций, что требует от программиста присвоения возвращаемого значения именованному объекту, если требуется какой-либо длительный эффект. (Разумеется, вы не должны ожидать, что это действие повлияет на значение mtcars
.)