自定义函数不会从magicfor返回for循环的结果

时间:2018-07-10 21:07:59

标签: r

我正在尝试创建一个在数据集中的特定列上运行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

我猜测magicfor正在进行一些时髦的事情。任何想法如何解决这个问题?一切都赞赏。

1 个答案:

答案 0 :(得分: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)