Пользовательская функция не возвращает результаты цикла for из magicfor

Я пытаюсь создать функцию, которая запускает кластеризацию kmeans для определенных столбцов в наборе данных и возвращает членство в кластере. Идея состоит в том, что кто-то другой может сказать: "Как бы выглядела кластеризация, если бы я использовал столбцы x,y и z".

Я пытаюсь использовать следующий код. По какой-то причине magic_result() не возвращает ничего, когда я помещаю это в функцию.

mydata.test <- data.frame(a = c(1,1,1,2,2,2,3,3,3), b = 
c(2,2,2,4,4,4,5,5,5), c = c(1,1,1,6,6,6,4,4,4), d = 
c(1,1,1,4,4,4,2,2,2), e = c(14,40,84,14,40,84,14,40,84))
mylist.test <- list(c(1,2),c(2,3),c(1,2,3),c(1,2,5))

magic_free()
my.kmeans.test <- function(myd,myk,myl) { 
    library(magicfor)
    magic_for(print,silent=T)
    for(i in myl) {
        kmeans <- kmeans(myd[,i],centers=myk,nstart=25)
        cl <- kmeans$cluster
        print(cl)
    }
    res <- magic_result()
    res.cl <- res$cl
    return(res.cl)
}

Чего я не понимаю, так это того, что когда я пытаюсь запустить это как цикл for (а не функцию), это работает.

library(magicfor)
magic_for(print,silent=T)
for(i in myl) {
  kmeans <- kmeans(mydata.test[,i],centers=3,nstart=25)
  cl <- kmeans$cluster
  print(cl)
}
res <- magic_result()
res.cl <- res$cl
res.cl

Я предполагаю, что с магией происходит нечто странное. Есть идеи как обойти это? Все ценится.

1 ответ

С помощью map от purrrможно просто сделать

library(purrr)
my.kmeans.test <- function(myd, myk, myl) { 
  map(myl, function(idx) {
    kmeans(myd[, idx], centers=myk, nstart=25)$center
  })
}

my.kmeans.test(mydata.test, 3, mylist.test)
Другие вопросы по тегам