# PRIMER 1
# pokažimo kako se na koncept for loopa lahko obesi funkcijo iz družine *apply
nek.vektor <- rep(NA, 10)
set.seed(1)
for (i in 1:length(nek.vektor)) {
nek.vektor[i] <- mean(runif(1000))
}
set.seed(1)
nek.s <- 1:10
nek.s <- sapply(X = nek.s, FUN = function(x) {
rezultat <- mean(runif(1000))
return(rezultat)
})
identical(nek.s, nek.vektor)
# PRIMER 2
# naredimo še en malo večji trivialen primer
system.time(
big.s <- sapply(X = 1:100, FUN = function(x) {
mean(runif(10000000))
})
)
# system.time meri koliko časa se nek izraz (funkcija) izvaja
# če zelim meriti več vrstic, moramo vrstice zaviti v oglate
# oklepaje:
#system.time({
# ...
# ...
#})
# PRIMER 3
# V tem primeru bomo pokazali kako inicializirati jedra in jim
# poslati podatke (tudi funkcije) potrebne za računanje na več
# jedrih. Podatke moramo v jedra poslati eksplicitno sami.
# naložimo paket snowfall in inicializiramo 4 jedra
library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
# Napišimo funkcijo, ki vrednosti vektorja spremeni v 1 ali 0.
# Funkcija je napisana zelo neoptimalno, tak način programiranja
# močno odsvetujem. Več o tem na
# http://www.burns-stat.com/pages/Tutor/R_inferno.pdf
racunanjeSemPaTja <- function(x, y) {
set.seed(x)
rzlt <- .interna(runs = y)
for (i in 1:length(rzlt)) {
if (rzlt[i] >= 0.5) rzlt[i] <- 1 else rzlt[i] <- 0
}
out <- table(rzlt)
write.table(x = out, file = paste("simulacija_", x, ".txt", sep = ""))
invisible(NULL)
}
# Pomožna funkcija, ki jo uporabimo znotraj funkcije
# racunanjeSemPaTja kot primer, ko je potrebno funkcijo
# poslati ostalim jedrom.
.interna <- function(runs) {
rzlt <- 0
for (i in 1:runs) {
rzlt <- c(rzlt, runif(1))
}
return(rzlt)
}
# nastavimo dolžino vektorja
rns <- 30000
# Primer, ki kaže kako moramo izvoziti vse potrebne elemente
# v vse sredice.
sfExport(list = c(".interna", "rns"))
pa.take.fore.para <- sfSapply(x = 1:12,
fun = racunanjeSemPaTja, y = rns, simplify = FALSE)
# na podoben nacin lahko uporabimo ostale funkcije družine apply
# sfApply
# sfLapply
# sfRapply in sfCapply (še) nista implementirana
# za load balancing je sfClusterApplyLB
# implementacija na superračunalnik dokaj preprosta (velja za cloudnumbers.com)
#sfInit(parallel = TRUE, cpus = 100, type = "MPI")
Sreda: 1198