【问题标题】:Loop over list of functions, and return function name as character循环函数列表,并将函数名称作为字符返回
【发布时间】:2015-06-09 19:37:34
【问题描述】:

在 R 中,我有一个函数列表(模拟策略)。例如:

a <- function(x){
        return(x)
      }

b <- function(y){
        return(y)
      }
funclist <- list(a,b)

我想编写一些代码来返回每个函数的名称。通常,对于我会使用的功能:

as.character(substitute(a))

但这不适用于列表,因为它只会返回列表名称(如预期的那样)。然后我尝试了 lapply:

> lapply(X = funclist,FUN = substitute)
Error in lapply(X = funclist, FUN = substitute) : 
  '...' used in an incorrect context

但得到上述错误。

理想情况下我会得到(lapply 解决方案):

[[1]]
[1] "a"

[[2]]
[1] "b"

甚至(应用解决方案):

[1] "a" "b"

【问题讨论】:

  • 如前所述,问题只能通过将列表元素与全局环境中定义的所有函数进行比较来解决。请注意,可能有多个匹配项。您应该改变产生这种需求的方法。
  • @Roland 我在尝试创建可重现的示例时可能过于简单化了。以上编辑
  • 我已经看到了。它不会改变我的评论。创建列表时,您应该只命名列表元素。否则,没有好的解决方案,你需要在这个问题之前改变你正在做的事情。

标签: r


【解决方案1】:

做完之后

funclist <- list(a,b)

对参数ab 求值并返回它们指向的函数。没有办法回到原来的名字。 (substitute()“技巧”适用于作为 Promise 传递给函数的参数。如果没有额外的转义,它不适用于评估调用。)

如果要保留名称,最好使用命名列表。你可以这样做

funclist <- list(a=a,a=b)

funclist <- setNames(list(a,b), c("a","b"))

甚至在这里使用mget()

funclist <- mget(c("a","b"))

所有这些方法都会返回一个命名列表,你可以使用

names(funclist)
# [1] "a" "b"

获取名称

【讨论】:

  • 那么,如果您的可重现示例与您实际所做的更加一致,那将会有所帮助。将对象存储在列表中后,不会保留该原始对象的名称。如果我这样做a&lt;-1; x&lt;-list(a);无法从x 回到"a"。评估列表中的所有参数。
  • @Gregor,我的错。以上编辑
  • 回复您编辑的答案:很公平,我没有意识到函数名称是这样被删除的。感谢您的说明和建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多