Uso di variabili di ambiente in r
-
21-12-2019 - |
Domanda
Sto cercando di capire il codice RIDUCER.R prelevato dal seguente sito web.
http://www.thecloudavenue. COM / 2013/10 / MAPREDUUCE-Programmazione-in-R-Uso-hadoop.html
Questo codice utilizza per lo streaming didoop usando r.
Ho dato il codice qui sotto:
#! /usr/bin/env Rscript
# reducer.R - Wordcount program in R
# script for Reducer (R-Hadoop integration)
trimWhiteSpace <- function(line) gsub("(^ +)|( +$)", "", line)
splitLine <- function(line) {
val <- unlist(strsplit(line, "\t"))
list(word = val[1], count = as.integer(val[2]))
}
env <- new.env(hash = TRUE)
con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
line <- trimWhiteSpace(line)
split <- splitLine(line)
word <- split$word
count <- split$count
if (exists(word, envir = env, inherits = FALSE)) {
oldcount <- get(word, envir = env)
assign(word, oldcount + count, envir = env)
}
else assign(word, count, envir = env)
}
close(con)
for (w in ls(env, all = TRUE))
cat(w, "\t", get(w, envir = env), "\n", sep = "")
.
Qualcuno potrebbe spiegare il significato dell'uso del seguente comando new.env e il successivo uso dell'Invio nel codice:
env <- new.env(hash = TRUE)
.
Perché è richiesto? Cosa succede se questo non è incluso nel codice?
Aggiornamento 06/05/2014
Ho provato a scrivere un'altra versione di questo codice senza avere un nuovo ambiente definito e ha dato il codice come segue:
#! /usr/bin/env Rscript
current_word <- ""
current_count <- 0
word <- ""
con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0)
{
line1 <- gsub("(^ +)|( +$)", "", line)
word <- unlist(strsplit(line1, "[[:space:]]+"))[[1]]
count <- as.numeric(unlist(strsplit(line1, "[[:space:]]+"))[[2]])
if (current_word == word) {
current_count = current_count + count
} else
{
if(current_word != "")
{
cat(current_word,'\t', current_count,'\n')
}
current_count = count
current_word = word
}
}
if (current_word == word)
{
cat(current_word,'\t', current_count,'\n')
}
close(con)
.
Questo codice fornisce la stessa uscita di quella con un nuovo ambiente definito.
Domanda: l'utilizzo di un nuovo ambiente fornisce alcun vantaggio da un punto di vista di Hadoop? C'è una ragione per usarlo in questo caso specifico?
Grazie.
Soluzione
La tua domanda è correlata all'ambiente in r, codice di esempio per creare un nuovo ambiente in R
> my.env <- new.env()
> my.env
<environment: 0x114a9d940>
> ls(my.env)
character(0)
> assign("a", 999, envir=my.env)
> my.env$foo = "This is the variable foo."
> ls(my.env)
[1] "a" "foo"
.
Penso che questo articolo possa aiutarti a http://www.r-bloggers .com / ambienti-in-r / o premere
?environment
.
per ulteriori informazioni
Mi piace sul codice che dai, l'autore crea un nuovo ambiente.
env <- new.env(hash = TRUE)
.
Quando vuole assegnare valore hanno definito l'ambiente
assign(word, oldcount + count, envir = env)
.
E per la domanda "Cosa succede se questo non è incluso nel codice?" Penso che tu possa trovare la risposta sul link che ho già fornito
Informazioni sui vantaggi che utilizzano il nuovo ENV in R è già stato risposto in Questo link
Quindi il motivo è in questo caso giocherai con il grande set di dati, quando si passa il set di dati sulla funzione, r farà una copia del set di dati e quindi i dati di ritorno sovrascriveranno il vecchio set di dati. Ma se si passa ENV, R procederà direttamente quel ENV senza copiare il set di dati ampio.