总结代码而不在 R 中做太多参数
Posted
技术标签:
【中文标题】总结代码而不在 R 中做太多参数【英文标题】:summarize code without making too many arguments in R 【发布时间】:2021-12-26 05:36:20 【问题描述】:每当我在我的代码中看到一些重复模式时,我都会觉得必须有一种方法来总结它。这是我正在努力解决的 R 中的一个示例:
if( all(auto.file.flag) )
save_dirs = c(basename(father_vcf_file),
basename(mother_vcf_file))
for(save_dir in save_dirs)
loc = file.path(save_dir, 'dual_analysis_results')
dir.create(loc, recursive=TRUE)
write_csvy(father_res, file.path(loc,father.out.file))
cat(child.out.file,'saved. \n')
write_csvy(mother_res, file.path(loc,mother.out.file))
cat(parents.out.file,'saved. \n')
fwrite(res_sumary_ord, file.path(loc,summary.out.file), sep='\t')
cat(summary.out.file,'saved. \n')
else
write_csvy(father_res, father.out.file)
cat(father.out.file,'saved. \n')
write_csvy(mother_res, mother.out.file)
cat(mother.out.file,'saved. \n')
fwrite(res_sumary_ord, summary.out.file, sep='\t')
cat(summary.out.file,'saved. \n')
代码说明: if all(auto.file.flag)
将三个结果保存在两个不同的目录中(目录名是根据其他一些变量生成的) if not save them without attaching any directory to the output file名字。
如果我用函数替换重复部分,函数将有 6 或 7 个参数。我是函数式编程的新手,但我觉得必须有一些更好的方法。提前致谢
【问题讨论】:
他们为什么需要这么多?考虑一下您可以创建一个名称向量。 @Elin 函数的参数应该包括所有三个结果对象(因为它们之间的保存函数不同)加上它们要保存的位置。 听起来像 4。 虽然这可能是一种特殊情况,因为使用字符变量我遇到了类似的情况,在一个函数中我想用另一个函数替换一堆代码,但参数会变得太多。我想也许有一些我不知道的 R 功能。 所以关键是尝试不同的方式将您的程序代码视为包含变量的东西,并且您希望尽可能抽象地操作它们。然后您的代码将变得更易于管理和阅读以及更快.. 【参考方案1】:根据我的经验,让这一点变得更好的方法是逐步进行,思考你在哪里复制以及如何增加抽象。
newcat <- function(filename)
cat(filename,'saved. \n')
filenames <- c("name1", "name2", "name3")
lapply(filenames,newcat)
由于您在两个分支中都这样做,所以把它放在最后 并一次性完成。
if( all(auto.file.flag) )
save_dirs = c(basename(father_vcf_file),
basename(mother_vcf_file))
for(save_dir in save_dirs)
loc = file.path(save_dir, 'dual_analysis_results')
dir.create(loc, recursive=TRUE)
write_csvy(father_res, file.path(loc,father.out.file))
write_csvy(mother_res, file.path(loc,mother.out.file))
fwrite(res_sumary_ord, file.path(loc,summary.out.file), sep='\t')
else
write_csvy(father_res, father.out.file)
write_csvy(mother_res, mother.out.file)
fwrite(res_sumary_ord, summary.out.file, sep='\t')
lapply(filenames,newcat)
然后继续每一个,考虑尽可能多地替换你的硬编码。使用文件名等所有内容制作数据框或向量。
if( all(auto.file.flag) )
save_dirs = c(basename(father_vcf_file),
basename(mother_vcf_file))
locs = file.path(save_dirs, 'dual_analysis_results')
for(save_dir in save_dirs)
dir.create(locs[save_dir], recursive=TRUE)
write_csvy(father_res,
file.path(locs[save_dir],father.out.file))
write_csvy(mother_res,
file.path(locs[save_dir],mother.out.file))
fwrite(res_sumary_ord,
file.path(locs[save_dir],summary.out.file), sep='\t')
else
write_csvy(father_res, father.out.file)
write_csvy(mother_res, mother.out.file)
fwrite(res_sumary_ord, summary.out.file, sep='\t')
lapply(filenames,newcat)
【讨论】:
谢谢。我仍然看到重复的部分。函数中是否有类似函数的函数可以访问父函数变量,并且您可以使用参数指定函数的行为? 是的,你可以这样做。我认为虽然你可以做很多事情,例如注意你可以创建这个向量:c("father.out.file", "mother.out.file", "summary.out.file") 因为你使用两次。以上是关于总结代码而不在 R 中做太多参数的主要内容,如果未能解决你的问题,请参考以下文章
Choreographer: Skipped frames : 应用程序可能在其主线程上做太多工作