2011-06-21 27 views
31

Bir işlev verildiğinde, hangi ad alanından geldiğini nasıl belirlersiniz?Bir işlevin ad alanını nasıl belirlersiniz?

Örneğin, komut isteminde mean.default yazıyorsam, çıktı temel pakette olduğu gerçeğini içerir. getNamespace(mean.default) gibi bir şey yapabilmek ve "temel" (veya gerçek temel ortam) döndürmek istiyorum.

getNamespace işlevi var, ancak yalnızca işlev adları yerine paket adlarını kabul ediyor gibi görünüyor. Ad alanını almak için iç kodu kullanır. src/main/print.c numaralı telefondan do_printfunction'a göz atmak kadar uzağım var ama pes ettim.

+0

Üç mükemmel cevap; hepinize teşekkürler. Hepsi işe yaradığından beri aralarında seçim yapmak zor, bu yüzden popüler oylamaya gidiyorum. –

cevap

32

Sadece son zamanlarda find()'u öğrendim, bu da böyle görünüyor.

R> find("ls") 
[1] "package:base" 
R> find("na.locf") 
[1] "package:zoo" 
13

findFunction başka bir seçenektir ve ?findFunction bunu kullanmak yerine mode="function" ile find gerektiğini söylüyor. findFunction sonucu, işlevin görünür sürümlerinin bulunduğu ortamların bir listesidir.

11

Sen getNamespaceName + environment istiyorum:

getNamespaceName(environment(mean.default)) 
# [1] "base" 
+1

Karakter girişi ile: 'getNamespaceName (ortam (get (" mean.default ")))'. –

1

Bu fonksiyon yüklenen ad ve küresel ortamda işlevlerini arar:

getEnvName <- function(f) { 
    attached <- c(environmentName(.GlobalEnv), loadedNamespaces()) 
    envs <- c(.GlobalEnv, lapply(attached[-1], .getNamespace)) 
    attached[vapply(envs, function(env) exists(f, env, inherits = FALSE), logical(1))] 
} 
median <- function() {} 
getEnvName("median") 
#> [1] "R_GlobalEnv" "stats" 
getEnvName(".try_quietly") 
#> [1] "tools" 
getEnvName("getEnvName") 
#> [1] "R_GlobalEnv" 
İlgili konular