2013-05-05 82 views
2

我有數據和工作概要功能:鑄造閉合到字符中的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得到。我想找到的東西E採用的形式,如果存在的話,這將產生相同的結果功能1:

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

我對這個問題的理解是,我需要使用的功能,將報meanmediansdf之後已經部分評估;我所有的嘗試都失敗了。

我開始寫函數3的函數;重寫爲函數1是我可以得到所需輸出的唯一方式,但是我不禁覺得在函數1中沒有引號可以實現這一點。

由於該區域有點混淆對我來說,除了提供代碼外,你能否解釋爲什麼你的解決方案能夠工作?

謝謝。

+1

'list(mean,median,sd)'是一個匿名函數的列表。他們沒有任何名字。 – user1609452 2013-05-05 05:01:42

回答

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沒有名稱組件。

然而,這一切似乎都很有人氣,而從不同角度接近問題可能可以避免做到上述的需要。

+0

謝謝 - 我想更好地理解R中的基礎結構,因此是人爲的方法! – ds440 2013-05-05 13:45:57

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 
+0

sapply使用原始參數列表的名稱作爲默認輸出名稱,因此結果如我所願,但是您不回答我如何通過在dimnames調用中重新設置f來設置名稱的具體問題。雖然謝謝! – ds440 2013-05-05 03:52:16

+0

@ ds440,一個簡單的方法來完成你的目標將是從字符開始並獲得功能;) – 2013-05-05 19:04:12