R循环更新

时间:2014-08-04 17:59:10

标签: r list

这似乎是一个基本问题,但我有以下列表和向量:

ll <- list(a=c(1,2,1,2,1,1,1),
           b=c("a","v","h","j","w","h", "m"),
           field=c("may","june","may","mars","july", "august", "september")
           id=125887,
           weather="sunny")

bool<-c(TRUE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE)

我的目标是:

ll <- list(a=c(1,2,1),
           b=c("a","v","h"),
           field=c("may","june","may","mars","july", "august", "september")
           id=125887,
           weather="sunny")

我可以通过以下方式完成:

ll$a <- ll$a[bool]
ll$b <- ll$b[bool]

对于很多修改,它很不方便。因此,创建函数的代码更有效:

f <- function(u){
    ll[[u]] <- ll[[u]][bool]
}

鉴于向量vec<-c("a","b"),我想做lapply(vec, f)之类的事情,但这并没有直接给我结果.R不能通过引用工作但我想知道我是否可以更新我的列表直接!

2 个答案:

答案 0 :(得分:0)

lapply将列表中的每个项目分别传递给您提供的功能。因此,f正在接收ll$a作为u。相反,你想要:

newll = lapply(ll, function(x) x[bool])

或者更安全一点

newll = lapply(ll, function(x) if(length(x)==length(bool)) x[bool] else x)

答案 1 :(得分:0)

lapply()中嵌入了for()循环,因此它不比真正循环更有效。通过更改函数外部的数据,而不是编写函数并打破函数编程范例,为什么不在顶层使用for循环呢?

for (i in 1:2){
  ll[[i]] <- ll[[i]][bool]
}

或循环遍历整个列表,只改变长度合适的位置

for (i in seq_along(ll)){
  if (length(ll[[i]])==length(bool)) ll[[i]] <- ll[[i]][bool]
}