Mám pomenovaný zoznam údajov a vlastnú funkciu, ktorú chcem použiť na údaje:
#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)
}
Teraz to chcem opakovať cez môj zoznam pomocou sapply
a získať uložený obrazový súbor pre každú iteráciu,s názvom súboru nastaveným ako názov zoznamu prvkov (napríklad a.svg, b.svg, c.svg v príklade vyššie) spolu s údajovým rámcom obsahujúcim výsledky výpočtov. Keď spustím toto:
#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 = ""))))
Získam očakávaný dátový rámec:
[,1] [,2] [,3]
a 6 2.500 5
b 15 5.200 26
c 24 8.125 65
ale skončím len s jedným súborom v cieľovom adresári: "a.svg"
Ako môžem preniesť mená prvkov zoznamu správne ako parameter do funkcie, ktorú volám sapply
?
odpovede:
4 pre odpoveď č. 1Ak potrebujete opakovať viac ako dva vektory súčasne (údaje aj názvy súborov), použite mapply
(alebo Map
)
res <- t(mapply(myfun, d.list, paste0(names(d.list), ".svg")))
1 pre odpoveď č. 2
V príspevku OP sa slučka prekladá cez každý prvok zoznamu d.list, ale nazýva názvy (d.list) v každej slučke, t.j. volať vektor (c("a", "b", "c")
). Musíme si vytvoriť slučku names
z "zoznamu d". Týmto spôsobom môžeme získať jednotlivca names
ako aj list
prvkov podľa podmnožiny.
lapply(names(d.list), function(x) paste0(x, ".svg"))
Ak používame funkciu OP
lapply(names(d.list), function(x) myfun(data= d.list[[x]],
f.name = paste0(x, ".svg")))