使用switch()

时间:2015-05-23 00:44:56

标签: r switch-statement igraph vertex-attributes

我对我问here的问题有一个跟进问题。

我想构建一个函数,它将根据某个参数(在下面的示例中称为lev)为图形指定属性。这是我的玩具图:

toy.graph <- graph.formula(121-221,121-345,121-587,345-587,221-587,490,588)

这是一个示例函数:

deco2 <- function(x, lev){
      switch(lev,
            one = {V(x)$color <- "red"},
            two = {V(x)$color <- "yellow"})
      return(x)
}

似乎color属性正在添加到我的图表中:

toy.graph <- deco2(toy.graph, lev="one")
> toy.graph
IGRAPH UN-- 6 5 -- 
+ attr: name (v/c), color (v/c)

然而,当我打印属性的值时,结果发现它们不存在:

> toy.graph$color
NULL

我错过了什么?

编辑当我只有一种颜色时,分配y的解决方案非常有效。但是,当我想在每个switch选项中分配多种颜色时,我仍然会遇到问题。以下是y作业的尝试:

V(toy.graph)$gender <- sample(c("M","F"), 6, replace = TRUE)
V(toy.graph)$gender
[1] "M" "F" "F" "M" "F" "M"

deco2 <- function(x, lev){
         y <- switch(lev,
             one = {V(x)$color = "red"},
             two = {V(x)[gender == "F"]$color = "yellow"
                    V(x)[gender == "M"]$color = "green"})
         V(x)$color <- y
         return(x)
}

出于某种原因,我只分配了"green"颜色:

toy.graph <- deco2(toy.graph, lev="two")
toy.graph
IGRAPH UN-- 6 5 -- 
+ attr: name (v/c), gender (v/c), color (v/c)
V(toy.graph)$color
[1] "green" "green" "green" "green" "green" "green"

1 个答案:

答案 0 :(得分:1)

这看起来像你想要的:

library(igraph)
toy.graph <- graph.formula(121-221,121-345,121-587,345-587,221-587,490,588)

deco2 <- function(x, lev){
  #make sure you assign switch's output to a variable (e.g. y)
  y <-
  switch(lev,
         one =  "red",
         two =  "yellow")
  V(x)$color <- y
  x
}


toy.graph <- deco2(toy.graph, lev="one")

> V(toy.graph)$color
[1] "red" "red" "red" "red" "red" "red"

我不认为在switch内为x分配值是个好主意。而是使用switch来设计它,即返回与输入相对应的值,然后在下一步中将该值赋给对象。

这种方式可以按预期工作!