将关闭转换为R中的字符

时间:2013-05-05 02:57:45

标签: r

我有数据和工作摘要功能:

[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))))

我对这个问题的理解是我需要使用引用meanmediansd但在f被部分评估之后引用的函数;我所有的尝试都失败了。

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

由于这个区域对我来说有点混乱,除了提供代码之外,您还可以解释为什么您的解决方案有效。

感谢。

2 个答案:

答案 0 :(得分:2)

你只需要命名元素:

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 

答案 1 :(得分:1)

假设您的功能是关闭的:

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没有名称组件。

然而,这一切似乎都很狡猾,从不同角度处理问题可能会避免需要这样做。