リファクタリングとか

昨日のコードをリファクタリングしました。forが二つも入っていて、消せるのに消さないとかTsukuba.R的にあれだったので。

getrankfunction <- function(dataset){
  rankfunction <- function(population){
    #任意のデータ型を入れられるのは、listのみなので、仕方なくlistでscoreを生成
    s <- c()
    p <- list()
    for(i in seq(length(population))){
      s[i] <- scorefunction(population[i][[1]],dataset)
      p[i] <- population[[i]]
    }
    l <- c()
    n <- 1
    for(i in order(s)){
      l[[n]] <- c(s[i],p[[i]])
      n <- n + 1
    }
    return(l)
  }
  return(rankfunction)
}

数値とnodeオブジェクトが入っているlistを要素の含むリストがlで、その数値が小さい順にソートしたのが戻り値になっています。「Mapの結果は毎回unlistしないといけなくて面倒だから、mapplyでいいんじゃね?」とか思ってたんですが、こういう場合だとMapが便利かもしれないですね。

getrankfunction <- function(dataset){
  rankfunction <- function(population){
    l <- Map(function(x){c(scorefunction(population[x][[1]],dataset),population[[x]])},seq(length(population)))
    return(Map(function(x){l[[x]]},order(unlist(lapply(l,function(x){x[[1]]})))))
  }
  return(rankfunction)
}