【问题标题】:Create alist (not list) of unevaluated functions in R在 R 中创建未评估函数的列表(不是列表)
【发布时间】:2016-08-27 20:36:22
【问题描述】:

我想使用 alist 在 R 中创建一个未评估函数的列表。我想要一个“myList”,可以通过以下方式生成:

xlist = c("A", "B", "C", ..., "Z")
myList = alist(print(xlist[1]), print(xlist[2]), print(xlist[3]), ..., print(xlist[26]))

但是上面的方法只有在 xlist 很短的时候才可行。如何使用一些巧妙的功能生成 myList?我试过 sapply。

tempfun = function(x) alist(print(x))
myList = sapply(xlist, tempfun)

但是 myList 的结果只包含 print(x),而不是第 i 个条目中的 print(xlist[i])。

【问题讨论】:

  • lapply(1:26, function(x) substitute(print(xlist[x]), list(x = x))) ?

标签: r


【解决方案1】:

我很难理解这个请求。函数名称不会被引用。制作函数列表非常简单:

funclist <- c(mean, sd, median)
X <- exp(1:10)
funclist[1](X)  # you might think that this was a vector, but NOT.
Error: attempt to apply non-function
funclist[[1]]( X )  # Note that funclist[[1]] _is_ a function so "works" with an open-paren
[1] 3484.377

对这个小谜团的解释是语言元素(其中函数只是一个例子)遵循列表处理语义,所以c(mean, sd, median)list(mean, sd, median) 确实没有什么不同。

如果您真的从“几乎真实”的函数名称开始,即对应于实际(未加引号的)R-name 的字符值,那么只需使用get 将该值推过可分离语言和数据的膜-对象

> a <- c("mean", "median", "sd")
> get(a[2])
function (x, na.rm = FALSE) 
UseMethod("median")
<bytecode: 0x7fb26bb76708>
<environment: namespace:stats>

我承认,当仔细检查时,“引用”的术语和围绕 quote 函数的结果语义令人困惑。请注意,函数的“名称”实际上并没有被两侧的双引号包围,除非它正在穿越 hadley 空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多