【问题标题】:Sink Stack Full - Saving Output of Table FunctionSink Stack Full - 保存表函数的输出
【发布时间】:2014-02-26 08:26:51
【问题描述】:

我有一个文件夹,里面装满了包含相同时间序列数据的文件。这是我的数据示例:

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

我的问题是,当我尝试使用 sink 将输出定向到文件时,我收到错误“sink stack is full”。

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)

})

如果我在函数中关闭接收器,它也不起作用。有没有更好的方法将我的数据保存到具有每个特定日期及其字母列频率的文件中?为什么这个水槽是错误的?

【问题讨论】:

  • sink 用于将控制台输出写入文件。您想使用 write.csv 构建数据的 CSV 文件。

标签: r file-io dataframe time-series


【解决方案1】:

我认为您期望return 输出到sink 中的当前文件。这不是 R 的工作原理。

return 向调用函数返回一个值。它不会创建任何输出。您可能正在尝试做的是:

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

即设置接收器,打印一些东西(进入接收器文件)然后重置接收器。你不关心返回值所以你不使用return

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

【讨论】:

  • 感谢您的回答。我可以让它工作,但我想我喜欢接收表函数的输出的原因是它是我似乎也能够获得相应日期的唯一方法,而打印似乎没有这样做。
猜你喜欢
  • 1970-01-01
  • 2014-12-05
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多