Использование переменных среды в R

Я пытаюсь понять код reducer.R, взятый со следующего веб-сайта.

http://www.thecloudavenue.com/2013/10/mapreduce-programming-in-r-using-hadoop.html

Этот код используется для потоковой передачи Hadoop с использованием R.

Я дал код ниже:

    #! /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 = "")

Может ли кто-нибудь объяснить значение использования следующей команды new.env и последующего использования env в коде:

    env <- new.env(hash = TRUE)

Почему это необходимо? Что произойдет, если это не будет включено в код?

Обновление от 05.06.2014

Я попытался написать другую версию этого кода без определения новой среды и дал код следующим образом:

    #! /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)

Этот код дает тот же результат, что и код с новой определенной средой.

Вопрос. Дает ли использование новой среды какие-либо преимущества с точки зрения Hadoop? Есть ли причина использовать его в этом конкретном случае?

Спасибо.


person Ravi    schedule 04.06.2014    source источник


Ответы (1)


Ваш вопрос связан со средой в R, пример кода для создания новой среды в 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"

Я думаю, что эта статья может помочь вам http://www.r-bloggers.com/environments-in-r/ или нажмите

?environment

для получения дополнительной помощи

Как и в коде, который вы даете, автор создает новую среду.

 env <- new.env(hash = TRUE)

когда он хочет присвоить значение, они определяют среду

assign(word, oldcount + count, envir = env)

А на вопрос "Что будет, если это не включить в код?" Я думаю, вы можете найти ответ по ссылке, которую я уже предоставил

О преимуществах использования новой среды в R уже дан ответ в эта ссылка

поэтому причина в том, что в этом случае вы будете играть с большим набором данных, когда вы передаете свой набор данных функции, R сделает копию вашего набора данных, а затем возвращаемые данные перезапишут старый набор данных. Но если вы передаете env, R будет напрямую обрабатывать этот env без копирования большого набора данных.

person rischan    schedule 04.06.2014
comment
Спасибо, Ришан. Приведенная вами ссылка помогла. Я опубликовал другую версию кода без определения новой среды, и код работает нормально. Однако я все еще не могу понять преимущества использования новой среды. - person Ravi; 05.06.2014
comment
@Ravi Я уже отредактировал ответ о преимуществе использования новой среды, пожалуйста, посмотрите ссылку, спасибо :) - person rischan; 05.06.2014
comment
Спасибо rischan, ссылка помогла - person Ravi; 10.06.2014