知道我在下面的语法中做错了什么?我正在尝试使用颜色渐变通过连续属性“EM”为我的节点着色。在最后一个命令后我得到错误:
palf [V(g)$ EM]中的错误:'closure'类型的对象不是子集化的
我不知道这意味着什么。
library(igraph) # This loads the igraph package
dat=read.csv(file.choose(),header=TRUE,row.names=1,check.names=FALSE) # choose an adjacency matrix from a .csv file
m=as.matrix(dat) # coerces the data set as a matrix
g=graph.adjacency(m,mode="undirected",weighted=NULL) # this will create an 'igraph object'
a=read.csv(file.choose())
V(g)$EM=as.character(a$EM[match(V(g)$name,a$ID)]) # This code says to create a vertex attribute called "EM" by extracting the value of the column "EM" in the attributes file when the ID number matches the vertex name.
V(g)$EM # This will print the new vertex attribute, "EM"
palf <- colorRampPalette(c("gray80", "dark red"))
V(g)$color <- palf[V(g)$EM]
答案 0 :(得分:1)
错误意味着您尝试在无法识别它的对象上使用[]
运算符 - 因为它没有子集。在这种情况下,对象是palf
,这是一个函数。 (R称之为closure
,在这种情况下,它基本上意味着“函数对象”。)palf
函数实际上做的是给出从“gray80”到“darkred”渐变的颜色向量,n
元素,其中n
是您传递的参数。
我有点不清楚你为什么使用“as.character”而不是“as.numeric”或其他东西,但是,假设EM
是一个实数,正如你的问题标题暗示的那样,你可以做这样的事情:
(见Scale a series between two points)
range1.100 <- function(x){1 + 99*(x-min(x))/(max(x)-min(x))}
colr <- palf(100);
V(g)$color <- colr[round(range1.100(V(g)$EM))]