リスト

  • こちらで、リストの特徴は、「再帰的」である、と習った
  • 再帰性を使うと、フラクタル的な何物かをハンドリングできるし、組合せで言ったら、複雑に入り組んだ集合の属・単体で言ったらファセットとか、知識グラフであればサブグラフとか、をうまい具合にハンドリングできるんではないかなー、と思う
  • そのための落書きソース
L<-list()

L[["a"]] <- list(name="a",vset=list())
L[["b"]] <- list(name="b",vset=list())
L[["c"]] <- list(name="c",vset=list())
L[["d"]] <- list(name="d",vset=list())
L[["e"]] <- list(name="e",vset=list())
L[["f"]] <- list(name="f",vset=list())
L[["g"]] <- list(name="g",vset=list())
L[["h"]] <- list(name="h",vset=list())
L[["i"]] <- list(name="i",vset=list())
L[["j"]] <- list(name="j",vset=list())

L[["a"]][["vset"]] <- list()

L[["b"]][["vset"]] <- list(L[["d"]])
L[["a"]][["vset"]] <- list(L[["b"]],L[["c"]])

L[["d"]][["vset"]] <- list(L[["e"]],L[["f"]])
L[["e"]][["vset"]] <- list(L[["g"]],L[["h"]])
L[["g"]][["vset"]] <- list(L[["i"]],L[["j"]])

setwd("C:\\Users\\ryamada\\Desktop\\再帰集合")
library(igraph)
infiles <- list.files()
infile.list <- list()
for(i in 1:length(infiles)){
	infile.list[[i]] <- read.table(infiles[i], sep = "\t", fill =TRUE)
}
g <- graph.empty(directed=FALSE)
g.plus <- graph.empty(directed=FALSE)
v.list <- list()
v.plus.list <- list()
e.list <- list()
e.plus.list <- list()
for(i in 1:length(infile.list)){
	infile <- infile.list[[i]]
	# 行列の方が好きなので行列にする
	infile.m <- as.matrix(infile)

	# エッジに関係するところだけを取り出す
	infile.m <- infile.m[,1:length(infile.m[1,])]
	# ノードをユニークにする
	unique.word <- unique(c(infile.m))
	unique.word <- unique.word[which(unique.word != "")]
	# ノードの名前に順序idをつける
	v.list[[i]] <- NULL
	v.list[[i]] <- unique.word
	e.list[[i]] <- matrix(0,0,2)
	v.plus.list[[i]] <- unique.word
	e.plus.list[[i]] <- matrix(0,0,2)
	#g <- g + vertices(v.name)

	# 行ごとに要素数を数えて
	for(j in 1:length(infile.m[,1])){
		num.kids <- length(which(infile.m[j,] != ""))-1
		if(num.kids>=1){
			for(k in 1:num.kids){
				#g <- g + edges(c(infile.m[i,1],infile.m[i,j+1]))
				e.list[[i]] <- rbind(e.list[[i]],c(infile.m[j,1],infile.m[j,k+1]))
			}
		}
		
	}
	sorted.e.list <- t(apply(e.list[[i]],1,sort))
	tmp.v <- paste(sorted.e.list[,1],sorted.e.list[,2],sep="")
	v.plus.list[[i]] <- c(unique.word,infiles[i],tmp.v)
	v.plus.list[[i]] <- unique(v.plus.list[[i]])
	#e.plus.list[[i]] <- e.list[[i]]
	for(j in 1:length(e.list[[i]][,1])){
		e.plus.list[[i]] <- rbind(e.plus.list[[i]],c(e.list[[i]][j,1],tmp.v[j]))
		e.plus.list[[i]] <- rbind(e.plus.list[[i]],c(e.list[[i]][j,2],tmp.v[j]))
		e.plus.list[[i]] <- rbind(e.plus.list[[i]],c(tmp.v[j],infiles[i]))
	}
	#plot(g,vertex.label=V(g)$name)

}
unique.v <- unique(unlist(v.list))
unique.plus.v <- unique(unlist(v.plus.list))

L <- list()
for(i in 1:length(unique.v)){
	L[[unique.v[i]]] <- list(list())
}

for(i in 1:length(infiles)){
	tmp <- unique(v.list[[i]])
	L[[infiles[i]]][[1]] <- list()
	for(j in 1:length(tmp)){
		L[[infiles[i]]][[1]][[tmp[j]]] <- L[[tmp[j]]]
	}
	#L[[infiles[i]]] <- list(unique(v.list[[i]]))
	for(j in 1:length(e.list[[i]][,1])){
		tmp <- e.list[[i]][j,]

		L[[tmp[1]]][[1]] <- unique(c(L[[tmp[1]]][[1]],tmp[2]))
		L[[tmp[2]]][[1]] <- unique(c(L[[tmp[2]]][[1]],tmp[1]))
		#L[[tmp[1]]] <- list(c(L[[tmp[1]]][[1]],tmp[2]))
		#L[[tmp[2]]] <- list(c(L[[tmp[2]]][[1]],tmp[1]))
		
	}
}


g <- graph.empty(directed=FALSE) + vertices(unique.v)
g.plus <- graph.empty(directed=FALSE) + vertices(unique.plus.v)
for(i in 1:length(infile.list)){
	for(j in 1:length(e.list[[i]][,1])){
		g <- g + edges(e.list[[i]][j,])
	}
	for(j in 1:length(e.plus.list[[i]][,1])){
		g.plus <- g.plus + edges(e.plus.list[[i]][j,])
	}
}
plot(g,vertex.label=V(g)$name,vertex.size=3,edge.arrow.mode=0)
dev.new()
plot(g.plus,vertex.label=V(g.plus)$name,vertex.size=3,edge.arrow.mode=0)