是的,它可以通过花哨的查找来完成。要解决这个问题,请在循环内调用 browser() 并检查环境中是否存在带有 ls() 的对象:
Called from: .fun(piece, ...)
Browse[1]> c
Called from: .fun(piece, ...)
Browse[1]> xx
[1] letters
<0 rows> (or 0-length row.names)
Browse[1]> ls(all.names = T)
[1] "xx"
所以这里除了空的数据框片段(原始数据的子集)之外什么都没有。如果这里有一个隐藏的物体来指示这件作品,那就太好了,但是唉。但是,我们可以看看父环境,看看我们是否走运:
Browse[1]> ls(all.names = T, envir = parent.frame(1))
[1] "i" "piece"
Browse[1]> ls(all.names = T, envir = parent.frame(2))
[1] "..." ".data" ".fun" ".inform" ".parallel" ".paropts" ".progress" "do.ply" "n" "pieces" "progress"
[12] "result"
好的,其中肯定有一些东西。可以使用get() 或mget() 一次获取多个:
Browse[1]> mget(ls(envir = parent.frame(1)), envir = parent.frame(1))
$i
[1] 2
$piece
[1] letters
<0 rows> (or 0-length row.names)
Browse[1]> mget(ls(envir = parent.frame(2)), envir = parent.frame(2))
$do.ply
function (i)
{
piece <- pieces[[i]]
if (.inform) {
res <- try(.fun(piece, ...))
if (inherits(res, "try-error")) {
piece <- paste(utils::capture.output(print(piece)),
collapse = "\n")
stop("with piece ", i, ": \n", piece, call. = FALSE)
}
}
else {
res <- .fun(piece, ...)
}
progress$step()
res
}
<bytecode: 0x559669467ca8>
<environment: 0x55966c7c6798>
$n
[1] 4
$pieces
$a
letters
1 a
$b
[1] letters
<0 rows> (or 0-length row.names)
$c
letters
1 c
$d
[1] letters
<0 rows> (or 0-length row.names)
$progress
$progress$init
function (x)
NULL
<bytecode: 0x559669453cd0>
<environment: 0x55966e5c8b50>
$progress$step
function ()
NULL
<bytecode: 0x559669453e58>
<environment: 0x55966e5c8b50>
$progress$term
function ()
NULL
<bytecode: 0x559669453e58>
<environment: 0x55966e5c8b50>
$result
$result[[1]]
NULL
$result[[2]]
NULL
$result[[3]]
NULL
$result[[4]]
NULL
所以我们看到parent.frame(1) 中的i 是当前子集计数,parent.frame(2) 中的片段名称具有我们想要的级别。把它们放在一起,我们可以得到当前的水平:
plyr::ddply(x, "letters", .drop = F, function(xx) {
#figure out the piece
i = get("i", envir = parent.frame(1))
levels = names(get("pieces", envir = parent.frame(1)))
current_piece = levels[i]
#do something
if (current_piece == "b") print("this is the b empty group!") else print("This is not level b")
data.frame(
count = nrow(xx)
)
})
导致:
[1] "This is not level b"
[1] "this is the b empty group!"
[1] "This is not level b"
[1] "This is not level b"
letters count
1 a 1
2 b 0
3 c 1
4 d 0