在R中使用环境变量

时间:2014-06-04 13:52:56

标签: r hadoop-streaming

我正在尝试了解从以下网站获取的reducer.R代码。

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

此代码用于使用R的Hadoop Streaming。

我已经给出了以下代码:

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

为什么需要这个?如果这不包含在代码中会发生什么?

2014年6月5日更新

我尝试编写此代码的另一个版本,但没有定义新的环境,并给出了如下代码:

    #! /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角度提供了任何优势?是否有理由在这种特定情况下使用它?

谢谢。

1 个答案:

答案 0 :(得分:3)

您的问题与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)

对于问题&#34;如果代码中没有包含这个问题,会发生什么?&#34;我想你可以在我已提供的链接上找到答案

关于在R中使用新env的优势已在this link

中得到解答

因此,在这种情况下,您将使用大量数据集,当您将数据集传递给函数时,R将复制数据集,然后返回数据将覆盖旧数据集。但是如果你传递env,R将直接处理该env而不复制大数据集。