在R中创建未评估函数的alist(而不是list)

时间:2016-05-02 23:36:07

标签: r

我想使用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?我尝试了一下。

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

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

1 个答案:

答案 0 :(得分:0)

我在理解这个请求时遇到了很多麻烦。函数名称不会被引用。制作功能列表非常简单:

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-space。