/ / पासिंग लिस्ट एलिमेंट के नामों को एक वेरिएबल के रूप में lapply - r, sapply के भीतर फंक्शन्स में

लापरवाही - आर, sapply के भीतर कार्यों के लिए एक चर के रूप में सूची तत्व नाम पास

मेरे पास डेटा की एक नामित सूची और एक कस्टम फ़ंक्शन है जिसे मैं डेटा पर लागू करना चाहता हूं:

#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")))