कोई समारोह "आँकड़े :: rnorm" कहा जाता है: वहाँ किसी भी तरह से मैं do.call उपयोग कर सकते हैं, या एक समारोह है कि सिर्फ do.call तरह बर्ताव करता है काम करने के लिए इसे पाने के लिए पैदा करते हैं। आप "आंकड़े" के नाम स्थान में rnorm
समारोह को खोजने चाहिए:
myfun <- get("rnorm", asNamespace("stats"))
myargs <- list(n=10, mean=5);
do.call(myfun, myargs);
अब आप निश्चित रूप से भी "आँकड़े :: rnorm" की तरह एक नाम से जा सकते हैं और यह नाम स्थान हिस्सा है और समारोह नाम में अलग अलग:
funname <- "stats::rnorm"
fn <- strsplit(funname, "::")[[1]]
myfun <- if (length(fn)==1) fn[[1]] else get(fn[[2]], asNamespace(fn[[1]]))
myargs <- list(n=10, mean=5);
do.call(myfun, myargs);
अद्यतन मैं सिर्फ दिखाने के लिए कि इस दृष्टिकोण 2.5x तेजी @Jeroen से एक की तुलना में है चाहता था ...
do.call.tommy <- function(what, args, ...) {
if(is.character(what)){
fn <- strsplit(what, "::")[[1]]
what <- if(length(fn)==1) {
get(fn[[1]], envir=parent.frame(), mode="function")
} else {
get(fn[[2]], envir=asNamespace(fn[[1]]), mode="function")
}
}
do.call(what, as.list(args), ...)
}
# Test it
do.call.tommy(runif, 10)
f1 <- function(FUN) do.call.tommy(FUN, list(5))
f2 <- function() { myfun<-function(x) x; do.call.tommy(myfun, list(5)) }
f1(runif)
f1("stats::runif")
f2()
# Test the performance...
system.time(for(i in 1:1e4) do.call.jeroen("stats::runif", list(n=1, max=50))) # 1.07 secs
system.time(for(i in 1:1e4) do.call.tommy("stats::runif", list(n=1, max=50))) # 0.42 secs
कैसे के बारे में 'do.call (आँकड़े :: rnorm, myargs)'? – kohske
@kohske - तो ऐसा लगता है कि 'आँकड़े :: rnorm (n = 10, mean = 5)' यह भी आसान है :-) – Tommy
लेकिन उस स्थिति में आप सूची का उपयोग अपने तर्क के रूप में नहीं कर सकते :-( – kohske