【问题标题】:Define global variable using function argument in R在 R 中使用函数参数定义全局变量
【发布时间】:2014-04-20 04:39:30
【问题描述】:

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

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

因此,在上面的示例中,我希望在调用函数后存在一个新的数据框,该数据框以用户输入的第三个参数命名。

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

有人可以帮助我了解发生了什么以及是否有办法做到这一点?

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

【问题讨论】:

  • 你可以assign(new.data, mydata[,-col], envir = .GlobalEnv) 虽然我会建议反对这整个想法
  • 看起来你的函数比直接显式调用需要更多的输入。重点是什么?在函数中使用&lt;&lt;- 分配东西也是一种糟糕的做法。
  • 您正在尝试编写具有副作用的函数。 R 是一种函数式语言,因此函数不应该有副作用。
  • @Dason 啊,很高兴知道

标签: r function global-variables


【解决方案1】:

使用assign() 函数。

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

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

&lt;&lt;- 并不总是分配给全局环境。

然而,一般来说,从函数返回内容比在函数内部设置全局变量要好。后者更难调试。

【讨论】:

  • 谢谢,这很有帮助。我会接受更多的打字,只需使用return
  • @JakeBurkhead:我展开解释什么时候引用什么时候不引用。
  • 是否有系统的方法来处理一堆变量?
【解决方案2】:

需要这个的一个原因是在大量使用 RStudio 控制台执行大量文本挖掘时。例如,如果您有一个大型语料库,并且您想根据主题将其分解为子语料库,则将处理作为函数执行并返回清理后的语料库会快得多。下面是一个例子:

 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")

然后新的语料库“retailCorp”出现在全局环境中,以进行进一步的工作,例如绘制词云等。另外,我可以通过该函数发送列表并获取大量语料库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多