r - 如何从列表中获取变量名

标签 r list evaluation

我有一个函数列表,其中还包含一个用户定义的函数:

> fun <- function(x) {x}
> funs <- c(median, mean, fun)

是否可以从此列表中获取函数名称作为字符串?到目前为止,我唯一的解决方法是创建包含函数名称作为字符串的向量:
> fun.names <- c("median", "mean", "fun")

当我想获得变量名时,我会使用这个技巧(如果这不正确,请纠正我),但正如您所见,它仅适用于一个变量,不适用于列表:
> as.character(substitute(mean))
[1] "mean"

> as.character(substitute(funs))
[1] "funs"

有什么东西也适用于列表吗?如果列表包含函数或数据类型有什么区别吗?

编辑:
我需要将这个函数列表(加上另一个数据)传递给另一个函数。然后列表中的那些函数将应用于数据集。需要函数名称,因为如果列表中传递了多个函数,我希望能够确定应用了哪个函数。到目前为止,我一直在使用这个:
window.size   <- c(1,2,3)
combinations  <- expand.grid(window.size, c(median, mean))
combinations  <- cbind(combinations, rep(c("median","mean"), each = length(window.size)))

最佳答案

一般来说,这是不可能的。考虑 funs 的这个定义:

funs <- c(median,mean,function(x) x);

在这种情况下,根本没有与用户定义函数关联的名称。 R 中没有规定所有函数必须在任何时间点绑定(bind)到一个名称。

如果您想开始对是否以及在何处定义所有此类 lambda 进行一些假设,那么可能性就会打开。

一种想法是在每个函数的闭包环境中搜索与函数本身匹配(相同)的条目,然后使用该名称。由于比较工作,这将导致性能损失,但如果您不必重复运行它可能是可以容忍的:
getFunNameFromClosure <- function(fun) names(which(do.call(c,eapply(environment(fun),identical,fun)))[1L]);

演示:
fun <- function(x) x;
funs <- c(median,mean,fun);
sapply(funs,getFunNameFromClosure);
## [1] "median" "mean"   "fun"

注意事项:

1:如前所述,这不适用于从未绑定(bind)到名称的函数。此外,它不适用于闭包环境不包含函数绑定(bind)的函数。如果函数绑定(bind)到与其闭包不同的环境中的名称(通过返回值、超赋值或 assign() 调用),或者如果其闭包环境被显式更改,则可能发生这种情况。

2:可以将一个函数绑定(bind)到多个名称。因此,您获得的名称是 eapply() 的结果。搜索可能不是您所期望的。这是一个很好的演示:
getFunNameFromClosure(ls); ## gets wrong name
## [1] "objects"
identical(ls,objects); ## this is why
## [1] TRUE

关于r - 如何从列表中获取变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36366535/

相关文章:

r - 根据另一个表更新数据框变量

project-management - 评估软件估计 : sure signs of unrealistic figures?

parsing - 评估已解析的持续时间表达式

javascript - 条件评估时间(Javascript)

r - 在 x 轴上的离散组之间添加刻度

r - 随机森林模型的形状图

r - 有 pmin 和 pmax 分别取 na.rm,为什么没有 psum?

python - 阅读csv时如何删除项目并返回列表

python - 每当我更改列表大小时,列表索引超出范围

list - 如何从Dart中的类列表检索属性?