/ / Priebeh názvov prvkov zoznamu ako premenných na funkcie v rámci lapply - r, sapply

Prenos názvov prvkov zoznamu ako premenných na funkcie v rámci lapply - r, sapply

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ď č. 1

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