使用R中的函数参数定义全局变量

时间:2014-03-14 18:06:04

标签: r function global-variables

我试图在R中编写一个从数据框中删除列的函数,并返回一个名为该函数参数的新数据:

drop <- function(my.data,col,new.data) {
new.data <<- my.data[,-col] 
return(new.data)
}

所以在上面的例子中,我希望在调用函数之后存在一个新的数据框,它被命名为用户输入的第三个参数。

当我调用函数时,会返回正确的数据框,但如果我尝试在全局环境中使用新数据框,我会得到object not found。我想通过使用<<-运算符来全局定义new.data

有人可以帮助我理解发生了什么以及是否有办法实现这一目标?

我发现thisthis似乎有关系,但我都没有回答我的问题。

2 个答案:

答案 0 :(得分:16)

使用assign()功能。

  assign("new.data", my.data[,-col], envir = .GlobalEnv) 

第一个参数应该是一个字符串。在这种情况下,结果全局变量将命名为“new.data”。如果new.data是名称本身,请从函数调用中删除引号。

<<-并不总是分配给全球环境。

但是,一般情况下,从函数返回事物比从函数内部设置全局变量更好。后者更难调试。

答案 1 :(得分:0)

需要这个的一个原因是在使用RStudio控制台进行大量文本挖掘时。例如,如果您有一个大型语料库,并且您希望根据主题将其分解为sub-corpi,则将处理作为函数执行并返回已清理的语料库可以更快。一个例子如下:

 processText <- function(inputText, corpName){
  outputName <- Corpus(VectorSource(inputText))
  outputName <- tm_map(outputName,PlainTextDocument)
  outputName <- tm_map(outputName, removeWords, stopwords("english"))
  outputName <- tm_map(outputName, removePunctuation)
  outputName <- tm_map(outputName, removeNumbers)
  outputName <- tm_map(outputName, stripWhitespace)
  assign(corpName, outputName, envir = .GlobalEnv)
  return(corpName)
}

在上面的案例中,我将数据框中的列输入为inputText,将所需的输出语料库输入为corpName。这允许以下简单任务处理一堆文本数据:

processText(retail$Essay,"retailCorp")

然后是新的语料库&#34; retailCorp&#34;在全球环境中显示进一步的工作,如绘制文字云等。另外,我可以通过函数发送列表并获得大量的corpi。