Sink Stack Full - 节省表函数输出

时间:2014-02-26 08:26:52

标签: r file-io dataframe time-series

我有一个包含相同时间序列数据的文件夹。以下是我的数据示例:

Date        Time       Letter
2009-09-25  23:56:00   a
2009-09-25  23:57:00   a
2009-09-25  23:58:00   b
2009-09-25  23:59:00   c
2009-09-26  00:00:00   c
2009-09-26  00:00:00   c
2009-09-26  00:00:00   c
2009-09-26  00:00:00   b
2009-09-26  00:00:00   a

我希望将我的功能应用于该文件夹中的所有文件。在此我将使用按日期拆分将每个文件拆分为单独的日期,并将函数应用于这些。然后我用表格返回日期,然后是当天输入的每个字母的数字。所以对于上面的数据,我会回来:

$2009-09-25
a 2
b 1
c 1

$2009-09-26
a 1
b 1
c 3

我的问题是,当我尝试使用接收器将输出定向到文件时,我收到错误“接收器堆栈已满”。

setwd("C:\\User1\\Documents\\Files")
path <- "C:\\User1\\Documents\\Files"

files <- list.files(path = path)

lapply(files,function(files, path){
  path <- "C:\\User1\\Documents\\Files"

  fp <- file.path(path, files)
  df <- read.csv(fp)

#A few more calculations with data here

# Separating data frame into large list of separate days
eachday <- split(df, df$Date)

myfunction <- function(df){

# More calculations with data within function

#Sink output to file 
sink(file="testing121.csv", append=TRUE, type = "output", split=FALSE)
return(table(night$Activity))
}

# Apply function over list of days
lapply(eachday, myfunction)

})

如果我在功能中关闭接收器,它也不起作用。有没有更好的方法将我的数据保存到具有每个特定日期和其Letter列的频率的文件?为什么这个下沉错了?

1 个答案:

答案 0 :(得分:0)

我认为您希望return输出到sink中的当前文件。这不是R的工作方式。

return向调用函数返回一个值。它不会创建任何输出。你可能想要做的是:

...
sink(file="foo.csv")
print(mydata)
sink()
}

即设置接收器,打印某些东西(进入接收器文件)然后重置接收器。您不关心返回值,因此您不使用return

如评论中所述,这不会创建一个正确的.csv文件(它看起来像控制台输出,[1] 10 20 30等等),所以你真的需要使用{ {1}}或write.table并且不使用write.csv函数。