我试图在R中编写一个从数据框中删除列的函数,并返回一个名为该函数参数的新数据:
drop <- function(my.data,col,new.data) {
new.data <<- my.data[,-col]
return(new.data)
}
所以在上面的例子中,我希望在调用函数之后存在一个新的数据框,它被命名为用户输入的第三个参数。
当我调用函数时,会返回正确的数据框,但如果我尝试在全局环境中使用新数据框,我会得到object not found
。我想通过使用<<-
运算符来全局定义new.data
。
有人可以帮助我理解发生了什么以及是否有办法实现这一目标?
答案 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。