昨日のコードをリファクタリングしました。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) }