2010-11-12 11 views
7

Giả sử chúng tôi có một danh sách (mylist) được sử dụng làm đối tượng đầu vào cho một hàm lapply. Có cách nào để biết phần tử nào trong mylist đang được đánh giá? Phương pháp này sẽ hoạt động trên lapplysnowfall::sfApply (và những người khác có thể áp dụng thành viên gia đình).yếu tố danh sách nào đang được xử lý khi sử dụng tuyết rơi :: sfLapply?

Trên chat, Gavin Simpson đã đề xuất phương pháp sau. Điều này rất hữu ích cho lapply nhưng không quá nhiều cho sfApply. Tôi muốn tránh các gói thêm hoặc không quan trọng với danh sách. Bất kỳ đề xuất?

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]]" 

Đây là phiên bản song song không cắt.

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() 

Trả lời

3

Tôi nghĩ bạn sẽ phải sử dụng giải pháp/đề xuất của Shane trong phiên trò chuyện đó. Lưu trữ đối tượng của bạn trong một danh sách như vậy mà mỗi thành phần của danh sách top chứa một thành phần với tên hoặc ID hoặc thí nghiệm chứa trong đó thành phần danh sách, cộng với một thành phần có chứa các đối tượng bạn muốn quá trình:

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)) 

Vì vậy, chúng tôi có cấu trúc sau:

> 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 

các có cái gì đó như dòng đầu tiên trong hàm sau, tiếp theo là bạn

foo <- function(x) { 
    writeLines(paste("Processing Component:", x$ID)) 
    sum(x$obj) 
} 

nào sẽ làm điều này:

> res <- lapply(obj, foo) 
Processing Component: 1 
Processing Component: 2 
Processing Component: 3 
Processing Component: 4 
Processing Component: 5 

Điều này có thể hoạt động khi có tuyết rơi.

2

Tôi cũng có thể thay đổi các thuộc tính như vậy.

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) 

(và phiên bản song song)

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) 
+0

Đó nhìn "sai" và chắc chắn đủ, khi tôi cố gắng 'attr (mylist [[1]]) <- 1', tôi nhận được: ' Lỗi trong 'attr <-' (' * tmp * ', value = 2): 2 đối số được chuyển đến 'attr <-' yêu cầu 3'. Tôi nghĩ bạn cần chỉ định tên cho thuộc tính –

+0

@BondedDust vui nhộn, tôi không nhớ tên này là KHÔNG hoạt động. Tôi đã chỉnh sửa hai dòng vi phạm. –