मेरे पास डेटा की एक नामित सूची और एक कस्टम फ़ंक्शन है जिसे मैं डेटा पर लागू करना चाहता हूं:
#Some example data
d.list <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))
#A simple function to process some data, write an output graph, and return an output
myfun <- function(data, f.name) {
y <- list()
y[1] <- data[1] + data[2] + data[3]
y[2] <- data[3] - data[1]/ data[2]
y[3] <- data[2] * data[3] - data[1]
svg(filename = f.name, width = 7, height = 5, pointsize = 12)
plot.new()
plot(data, y)
dev.off()
return(y)
}
मैं अब अपनी सूची का उपयोग करके इस पर पुनरावृति करना चाहता हूं sapply
और प्रत्येक पुनरावृत्ति के लिए एक सहेजी गई छवि फ़ाइल प्राप्त करें,गणना के परिणामों वाले डेटा फ्रेम के साथ, सूची तत्व नाम (उदाहरण के लिए, a.svg, b.svg, c.svg ऊपर दिए गए फ़ाइल नाम) के साथ सेट करें। जब मैं इसे चलाता हूं:
#Iterate over the example data using sapply
res <- t(sapply(d.list, function(x) myfun(data=x,
f.name=paste(names(d.list), ".svg", sep = ""))))
मुझे अपेक्षित डेटा फ़्रेम मिलता है:
[,1] [,2] [,3]
a 6 2.500 5
b 15 5.200 26
c 24 8.125 65
लेकिन मैं केवल लक्ष्य निर्देशिका में एक फ़ाइल के साथ समाप्त होता हूं: "
मैं फ़ंक्शन एलिमेंट के पैरामीटर के रूप में सूची तत्व नामों को सही तरीके से कैसे पास कर सकता हूं sapply
?
उत्तर:
उत्तर № 1 के लिए 4यदि आपको एक ही समय में दो वैक्टर (आपके डेटा और फ़ाइल नाम दोनों) पर पुनरावृति करने की आवश्यकता है, तो उपयोग करें mapply
(या Map
)
res <- t(mapply(myfun, d.list, paste0(names(d.list), ".svg")))
उत्तर № 2 के लिए 1
ओपी की पोस्ट में, यह "d.list" के प्रत्येक तत्व के माध्यम से लूप किया गया है, लेकिन प्रत्येक लूप में नाम (d.list) कहा जाता है यानी एक वेक्टर बुला रहा है (c("a", "b", "c")
)। हमें लूप की जरूरत है names
"d.list" का। इस तरह, हम व्यक्ति प्राप्त कर सकते हैं names
साथ ही साथ list
तत्वों को कम करके
lapply(names(d.list), function(x) paste0(x, ".svg"))
अगर हम ओ पी के फंक्शन का उपयोग कर रहे हैं
lapply(names(d.list), function(x) myfun(data= d.list[[x]],
f.name = paste0(x, ".svg")))