कार्यों की सूची को तर्कों की सूची में लागू करके एक सूची बनाने का आर-मुहावरेदार तरीका क्या है?
उदाहरण के लिए, कार्यों की एक सूची और एक सूची तर्कों को देखते हुए, संख्या के बराबर (कहते हैं, तीन),
fncs <- list(f1, f2, f3)
args <- list(x1, x2, x3)
मैं फ़ंक्शन मानों की सूची प्राप्त करना चाहता हूं,
fnc_vals <- list(f1(x1), f2(x2), f3(x3))
दूसरे शब्दों में, मैं बेस-आर फ़ंक्शन का एक सामान्यीकृत रूप लागू करना चाहता हूं mapply
सूचियों के लिए fncs
तथा args
(जो तर्कों की सूची में एकल फ़ंक्शन लागू करता है)।
यह आसानी से किया जा सकता है:
dapply <- function(args, fncs, ...) { # "diagonal" apply
lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...))
}
fnc_vals <- dapply(args, fncs)
हालांकि, मेरी नजर में, यह अनाड़ी है, क्योंकि यहऔर अधिक प्राकृतिक होगा - यदि आर में संभव हो, तो बिना गर्भनिरोध के - वांछित फ़ंक्शन-वैल्यू सूची का उत्पादन करने के लिए कार्यों और तर्कों के माध्यम से जोड़ी को चलाने के लिए; में अजगर, कि इस तरह से जाना होगा:
fncs = [f1, f2, f3]
args = [x1, x2, x3]
fnc_vals = [f(x) for f, x in zip(fncs, args)]
क्या यह "ज़िप्पी" निर्माण आर में भी लागू किया जा सकता है?
उत्तर:
जवाब के लिए 3 № 1आप उपयोग कर सकते हैं Map
(जो है mapply
अलग चूक के साथ) do.call
:
fncs <- list(mean, median, sd)
args <- list(1:5, 11:13, c(1,1,1,2))
Map(function(f, x) do.call(f, list(x)), fncs, args)
#[[1]]
#[1] 3
#
#[[2]]
#[1] 12
#
#[[3]]
#[1] 0.5
अनाम फ़ंक्शन आवश्यक है क्योंकि do.call
जरूरत है list
इसके दूसरे तर्क के लिए।
या जब से आप किसी भी तरह एक अनाम फ़ंक्शन लिखते हैं, तो आप बस उपयोग कर सकते हैं Map(function(f, x) f(x), fncs, args)
जैसा कि @akrun बताते हैं।