假设我们有一个列表(mylist
),用作lapply
函数的输入对象。有没有办法知道mylist
中的哪个元素正在被评估?该方法应该适用于lapply
和snowfall::sfApply
(以及可能的其他人也适用于家庭成员)。
在chat上,Gavin Simpson提出了以下方法。这适用于lapply
但不适用于sfApply
。我想避免额外的包或摆弄列表。有什么建议吗?
mylist <- list(a = 1:10, b = 1:10)
foo <- function(x) {
deparse(substitute(x))
}
bar <- lapply(mylist, FUN = foo)
> bar
$a
[1] "X[[1L]]"
$b
[1] "X[[2L]]"
这是没有削减它的并行版本。
library(snowfall)
sfInit(parallel = TRUE, cpus = 2, type = "SOCK") # I use 2 cores
sfExport("foo", "mylist")
bar.para <- sfLapply(x = mylist, fun = foo)
> bar.para
$a
[1] "X[[1L]]"
$b
[1] "X[[1L]]"
sfStop()
答案 0 :(得分:3)
我认为你将不得不在聊天会话中使用Shane的解决方案/建议。将对象存储在列表中,使顶部列表的每个组件都包含一个组件,该组件包含该列表组件中包含的名称或ID或实验,以及包含要处理的对象的组件:
obj <- list(list(ID = 1, obj = 1:10), list(ID = 2, obj = 1:10),
list(ID = 3, obj = 1:10), list(ID = 4, obj = 1:10),
list(ID = 5, obj = 1:10))
所以我们有以下结构:
> str(obj)
List of 5
$ :List of 2
..$ ID : num 1
..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10
$ :List of 2
..$ ID : num 2
..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10
$ :List of 2
..$ ID : num 3
..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10
$ :List of 2
..$ ID : num 4
..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10
$ :List of 2
..$ ID : num 5
..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10
类似于以下函数中的第一行,后跟
foo <- function(x) {
writeLines(paste("Processing Component:", x$ID))
sum(x$obj)
}
这将做到这一点:
> res <- lapply(obj, foo)
Processing Component: 1
Processing Component: 2
Processing Component: 3
Processing Component: 4
Processing Component: 5
哪些可能适用于降雪。
答案 1 :(得分:2)
我也可以改变这样的属性。
mylist <- list(a = 1:10, b = 1:10)
attr(mylist[[1]], "seq") <- 1
attr(mylist[[2]], "seq") <- 2
foo <- function(x) {
writeLines(paste("Processing Component:", attributes(x)))
}
bar <- lapply(mylist, FUN = foo)
(和平行版)
mylist <- list(a = 1:10, b = 1:10)
attr(mylist[[1]], "seq") <- 1
attr(mylist[[2]], "seq") <- 2
foo <- function(x) {
x <- paste("Processing Component:", attributes(x))
}
sfExport("mylist", "foo")
bar <- sfLapply(mylist, fun = foo)