lapply和Map中如何保持函数调用属性一致?

问题描述 投票:0回答:1

我想将函数调用附加为

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 的解决方案。

r list function scope lapply
1个回答
0
投票

你不能像这样传递变量名。如果您希望函数记录调用并且您关心可用的名称,则更好的解决方案是构建调用。在这里我们可以用

lapply
来做到这一点。
do.call

© www.soinside.com 2019 - 2024. All rights reserved.