我想将函数调用附加为
attr
ibute。虽然直接使用 fn()
工作正常,但当我在 lapply()
内运行它时,它返回 X[[i]]
而不是传递给 d=
参数的实际名称。我希望看到 df1
和 df2
作为输出,而不是 X[[i]]
。
> df1 <- df2 <- data.frame(matrix(1:12, 3, 4))
> fn <- \(d, x=x, y=999, ...) {
+ cl <- match.call()
+ fa <- formals(fn)
+ fa[length(fa)] <- NULL
+ ma <- setdiff(names(fa), names(cl))
+ cl[-c(1, 2)] <- lapply(cl[-c(1, 2)], eval, envir=parent.frame())
+ # cl$d <- quote(d)
+ res <- TRUE
+ attr(res, 'call') <- cl
+ return(res)
+ }
> z. <- 777
> fn(df1, x=666, z=z.)
[1] TRUE
attr(,"call")
fn(d = df1, x = 666, z = 777)
> lapply(list(df1=df1, df2=df2), fn, x=666, z=z.)
$df1
[1] TRUE
attr(,"call")
FUN(d = X[[i]], x = 666, z = 777)
$df2
[1] TRUE
attr(,"call")
FUN(d = X[[i]], x = 666, z = 777)
这显然与之前的问题有关,所以我按照建议尝试了
Map
,但是,显然它并不能很好地概括。
> Map(list(df1=df1, df2=df2), f=fn, x=666, z=z.)
$df1
[1] TRUE
attr(,"call")
(\(d, x=x, y=999, ...) {
cl <- match.call()
fa <- formals(fn)
fa[length(fa)] <- NULL
ma <- setdiff(names(fa), names(cl))
cl[-c(1, 2)] <- lapply(cl[-c(1, 2)], eval, envir=parent.frame())
# cl$d <- quote(d)
res <- TRUE
attr(res, 'call') <- cl
return(res)
})(d = dots[[1L]][[2L]], x = 666, z = 777)
$df2
[1] TRUE
attr(,"call")
(\(d, x=x, y=999, ...) {
cl <- match.call()
fa <- formals(fn)
fa[length(fa)] <- NULL
ma <- setdiff(names(fa), names(cl))
cl[-c(1, 2)] <- lapply(cl[-c(1, 2)], eval, envir=parent.frame())
# cl$d <- quote(d)
res <- TRUE
attr(res, 'call') <- cl
return(res)
})(d = dots[[1L]][[2L]], x = 666, z = 777)
然后我尝试做
cl$d <- quote(d)
,cl$d <- quote(substitute(d))
,cl$d <- quote(eval(parse(text=d)))
,cl$d <- quote(get(d))
,如上所述,但无济于事。这是 cl$d <- quote(d)
版本的结果:
> fn(df1, x=666, z=z.)
[1] TRUE
attr(,"call")
fn(d = d, x = 666, z = 777)
> lapply(list(df1=df1, df2=df2), fn, x=666, z=z.)
$df1
[1] TRUE
attr(,"call")
FUN(d = d, x = 666, z = 777)
$df2
[1] TRUE
attr(,"call")
FUN(d = d, x = 666, z = 777)
> lapply(list(df1=df1, df2=df2), fn, x=666, z=z.)
$df1
[1] TRUE
attr(,"call")
FUN(d = df1, x = 666, z = 777)
$df2
[1] TRUE
attr(,"call")
FUN(d = df2, x = 666, z = 777)
请注意,我正在寻找使用基础 R 的解决方案。
你不能像这样传递变量名。如果您希望函数记录调用并且您关心可用的名称,则更好的解决方案是构建调用。在这里我们可以用
lapply
来做到这一点。do.call