我有数据和工作摘要功能:
[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
,median
和sd
但在f
被部分评估之后引用的函数;我所有的尝试都失败了。
我开始编写函数3之类的函数;重写为函数1是我获得所需输出的唯一方法,但是我不禁觉得有一些方法可以在函数1中没有引号的情况下实现这一点。
由于这个区域对我来说有点混乱,除了提供代码之外,您还可以解释为什么您的解决方案有效。
感谢。
答案 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
没有名称组件。
然而,这一切似乎都很狡猾,从不同角度处理问题可能会避免需要这样做。