3

我有数据和工作总结功能:

[data:]       x = runif(100)

[function 1:] sapply(list("mean", "median", "sd"),
                  function(f) array(do.call(f, list(x)),
                  dimnames=list(f)))

     mean    median        sd 
0.5198142 0.5566567 0.3048372  

以下也运行,但没有给出dimnames

[function 2:] sapply(list(mean, median, sd), 
                  function(f) array(do.call(f, list(x))))

[1] 0.5198142 0.5566567 0.3048372

我尝试了 , , 等的各种组合,但未能成功quote()enquote()substitute()deparse()与函数 2 相同的结果(其中未引用要应用的函数),就像我从函数 1 得到的一样。我想找到以下形式的东西,如果它存在,产生与函数 1 相同的结果:

[function 3:] sapply(list(mean, median, sd), 
                  function(f) array(do.call(f, list(x)), 
                  dimnames=list(SOMEFUNCTION(f))))

我对这个问题的理解是我需要使用将引用的函数,但mean经过部分评估;我在这方面的所有尝试都失败了。 mediansdf

我开始编写函数 3 之类的函数;重写为函数 1 是我可以获得所需输出的唯一方法,但是我不禁觉得有一些方法可以在没有函数 1 中的引号的情况下实现这一点。

由于这个领域对我来说有点困惑,除了提供代码之外,您能否解释一下为什么您的解决方案有效。

谢谢。

4

2 回答 2

3

您只需命名元素:

sapply(list(mean=mean, median=median, sd=sd), 
              function(f) array(do.call(f, list(x))))

#      mean    median        sd 
# 0.5151791 0.4883450 0.2723679 

sapply(list(orUse=mean, YourChoice=median, OfNames=sd), 
        function(f) array(do.call(f, list(x))))

 #     orUse YourChoice    OfNames 
 # 0.5151791  0.4883450  0.2723679 
于 2013-05-05T03:24:47.900 回答
2

假设您的函数是闭包:

set.seed(0)
x = runif(100)

sapply(list(mean, median, sd), 
                  function(f){
funcs <- ls(environment(f))
names <- funcs[which(sapply(lapply(funcs,get,environment(f)),function(y)identical(y,f)))]
array(do.call(f, list(x)),dimnames=list(names))
}
)

#     mean    median        sd 
#0.5207647 0.4878107 0.2701225 

它不是很雄辩。如果您无法命名函数列表,则可以检查给定函数的环境。使用identical您可以将您的函数与该函数环境中的对象进行比较。

Closures没有名称组件。

然而,这一切似乎都非常做作,从不同的角度解决问题可能会避免需要执行上述操作。

于 2013-05-05T06:59:48.960 回答