首页 > 解决方案 > 使用 lapply 运行函数时,如何在文本文件中逐行写入输出?

问题描述

这是我的功能

Mc_bval<-function(filename){
  cat <- read.table(paste(cat_file, sep=""), header=TRUE)
  mag <- cat$Magnitude
  mag <- cat$Magnitude
  Mc_bootstrap <- numeric(nbsample)
  for(i in 1:nbsample) Mc_bootstrap[i] <- maxc(sample(mag, replace=TRUE),mbin)$Mc
  Mc_mean <- mean(Mc_bootstrap, na.rm=TRUE)
  Mc_sd <- sd(Mc_bootstrap, na.rm=TRUE)
  mag_b <- mag[mag>=Mc_mean]
  b <- b.guten(mag_b, Mc_mean)
  return(list(c(b=b),Mc=Mc_mean,Mc_sd=Mc_sd))
  #return(c(b=b,Mc))
}

函数正在返回值,我想通过读取文件列表中的每个文件名。我想为每个文件写一行输出,包括文件名这是我试过的代码

filelist = list.files(pattern="*$.csv$")
outfile <- file("checkout.txt","w")
#apply(random_data, 2, checkfun, fileConn=outfile)

out = lapply(filelist,FUN = Mc_bval)
close(outfile)

输出文件会有点像这样

cata_extract1.csv 1.46 0.25 4.15 0.33
cata_extract2.csv 1.44 0.35 4.25 0.23
cata_extract3.csv 1.4  0.25 4.25 0.24
cata_extract4.csv 1.34 0.85 4.25 0.23

你能帮帮我吗?

标签: rapplylapply

解决方案


这是一个基于您所拥有的可行示例。我创建了一个示例函数,它接受 afilename并返回一个包含名称长度和随机数的列表。

在你之后lapply,你可以writeLines用来输出你的文件名和列表结果(你的列表结果被转换为一个字符向量)。在这种情况下,您可以使用一秒paste来连接两个向量。

我希望这可以适应您的使用。

my_fun <- function(filename) {
  a = nchar(filename)
  b = sample(10,1)
  return(list(a, b))
}

filelist = list.files(pattern="*.csv")
outfile <- file("checkout.txt", "w")

out <- lapply(filelist, FUN = my_fun)

writeLines(paste(filelist, unlist(lapply(out, paste, collapse=" "))), outfile)

close(outfile)

推荐阅读