为什么我的R函数一步一步工作,而不是作为执行运行时

时间:2015-03-30 19:38:14

标签: r

我对此非常困惑,我确信这很简单,希望有人能指出我正确的方向。

我正在使用TM软件包开发一个文本挖掘项目,当我在控制台中运行代码时,它可以正常工作,但是当我调用函数本身时,最终输出为空。

以下是一些示例代码:

func <- function(filename, count=100, full=FALSE){

  packages <- c("ggplot2", "tm")
  if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
    install.packages(setdiff(packages, rownames(installed.packages())))  
  }
  library(tm)
  library(ggplot2)

  ## get data
  data <- read.csv(filename) 

  ##Create corpus and remove formatting from text
  Tickets <- Corpus(DataframeSource(data))
  Tickets = tm_map(Tickets, removePunctuation)
  Tickets = tm_map(Tickets, tolower)

  ##Create stopwords vector to remove complete list from data
  stopwords <- read.csv("stopwords.csv", header=FALSE)
  stopwords <- as.character(stopwords[,1])
  stopwords <- c(stopwords("english"), stopwords)

  ## create full analasis of whole data, if selected by user
  if(full==TRUE){
    Tickets = tm_map(Tickets, PlainTextDocument) ##convert back to a text document we can analyse
    Tickets.TDM <- TermDocumentMatrix(Tickets) ## create matrix for analysis
    TDM.frame <- data.frame(as.matrix(Tickets.TDM))
    write.csv(TDM.frame, "Full_queue_analysis.csv")
  }

  ## Remove Stopwords and irrelevant data then convert to TDM for analysis
  Tickets = tm_map(Tickets, removeWords, stopwords)
  Tickets = tm_map(Tickets, removeNumbers)
  Tickets = tm_map(Tickets, stripWhitespace)
  Tickets = tm_map(Tickets, PlainTextDocument)
  Tickets.TDM <- TermDocumentMatrix(Tickets)

  ## matrix to frame for additional calculations
  TDM.frame <- data.frame(as.matrix(Tickets.TDM))

  ##count each word once word per entry and only display those which count more than user specified amount
  Counts.df <- data.frame(rowSums(TDM.frame > 0))
  colnames(Counts.df) <- "count"
  Counts.df <- subset(Counts.df, count > count)

  ## create csv file for final counts
  write.csv(Counts.df, "Queue_analysis.csv")

  ##Print basic analysis based on user option
  cat("Terms which appear more than",count,"times:")
  findFreqTerms(Tickets.TDM, count)

初始化Counts.df向量时,事情似乎出错了,我可以通过控制台完美地运行它,并使用正确的数据进行填充,但是当它在函数中运行时它完全是空的,尽管它确实存在。

没有错误,函数按预期结束,但打开csv文件时,只有“count”标题为空。

感谢您的任何建议!

编辑 - 添加了功能本身,抱歉!

1 个答案:

答案 0 :(得分:1)

您认为count > count在做什么?怎么能比自己大?给定显示的功能代码,100 > 100将是subset调用中subset()参数中使用的内容。这评估为FALSE(出于显而易见的原因)

> 100 > 100
[1] FALSE

因此你要丢弃所有行。

E.g:

> subset(mtcars, 100 > 100)
 [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
<0 rows> (or 0-length row.names)

您的代码中存在逻辑错误,但我无法弄清楚您的意图,因此您需要自己解决。如果元素大于count(在函数定义中默认设置为100),您希望保留哪些计数向量?你的意思是

Count.df <- subset(Counts.df, Count.df[,1] > count)
啊,便士掉了。这只是与countsubset()的评估相关的问题。这是一个错误的简单例子:

> foo <- function(foo, cyl = 3) {
+ subset(mtcars, cyl > cyl)
+ }
> foo()
 [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
<0 rows> (or 0-length row.names)

cyl调用中的subset被评估为函数定义cyl中定义的cyl = 3的值,而不是cyl中的向量mtcars subset(mtcars, FALSE)数据框。因此,您得到Count.df的结果。

那么你如何调用Count count中的列而不是Count.df <- subset(Counts.df, Count > count) ,然后让代码行为:

{{1}}

哪个应该有用。