【问题标题】:Dynamically initializing variables in R using functional programming使用函数式编程在 R 中动态初始化变量
【发布时间】:2014-11-23 22:45:06
【问题描述】:

您好,我正在编写一个函数来读取文件并返回时间序列。然后我需要将此时间序列分配给一个变量。我试图以简洁的方式做到这一点,并利用 R 的任何函数式编程特性。

 # read a file and returns the 
 readFile <- function(  fileName , filePath){
     fullPath <- paste(filePath, filename, sep='');
     f <- as.xts(read.zoo(fullPath, format='%d/%m/%Y', 
                   FUN=as.Date, header=TRUE, sep='\t'));
     return(na.locf(f));
 }

filePath <- 'C://data/'
# real list of files is a lot longer
fnames <- c('d1.csv', 'd2.csv','d3.csv');
varnames <- c('data1', 'data2', 'data3');

在上面的代码中,我想通过将 readfile 函数应用于 fnames 和文件路径(它始终是常量),以 data1、data2、data2 的名称初始化变量。

类似:

lapply( fnames, readFile, filePath);

当然,上述方法不起作用,它也没有执行我想要实现的动态变量分配。有任何 R 函数式编程大师可以指导我吗?

这个的工作版本看起来像:

data1 <- readFile(  'd1.csv', filepath);
data2 <- readFile(  'd2.csv', filepath);

哎呀

【问题讨论】:

  • 感谢 shadow - 是的,它部分重复,但我也想了解如何使用 lapply 来实现许多变量,因为我是 FP 新手。
  • 如果你真的想这样做(阅读链接问题中的 cmets:不要这样做),你可以使用mapply(FUN=assign, x=varnames, value=data, MoreArgs=list(envir=.GlobalEnv))

标签: r functional-programming lapply


【解决方案1】:

构造具有指定名称的许多变量是 SO 上的一个常见请求,当然可以使用 assign 函数进行管理,但是如果您构建一个列表而不是多个变量,您可能会发现处理数据更容易。例如,您可以读取所有结果并获得一个命名列表:

lst <- setNames(lapply(fnames, readFile, filePath), varnames)

然后,您可以使用 lst[["data1"]]lst[["data2"]]lst[["data3"]] 从每个 csv 文件访问您的结果。

这种方法的好处是,您现在可以使用 lapply(lst, ...) 对所有时间序列变量执行操作,而不是遍历所有变量或遍历变量名并使用 get 函数。

【讨论】:

  • 谢谢,我正在尝试。
  • setnames(lapply(fnames, readFile, filePath), varnames) 中的错误:x 不是 data.table 或 data.frame
  • @user1480926 setNames,不是setnames
  • 简单而优雅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2016-09-23
  • 2022-11-30
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多