如何读取具有动态名称的文件,同时避免在 R 中进行硬编码?

Posted

技术标签:

【中文标题】如何读取具有动态名称的文件,同时避免在 R 中进行硬编码?【英文标题】:How to read in file with dynamic name while avoiding hard-coding in R? 【发布时间】:2020-01-30 05:46:36 【问题描述】:

我在读取具有动态名称的 csv 文件时遇到问题并且避免对文件路径进行硬编码。我想要简洁的代码(非硬编码)。如果我对完整路径(“~”之前的所有内容)进行硬编码,它可以很好地读取文件。但是软编码(如果这与硬编码相反)它给出错误的文件路径(尽管在错误中显示了正确的路径。我有两个可变部分的文件名,我在阅读之前粘贴到文件名中在。如果我避免粘贴,只为每个人输入一个路径,它也可以工作。

#dynamic part I usually have in a loop with all the options. 
part_a <- "outside" #other options here in my loop include "inside"
part_b <- "late" # other option "early" or "preterm"

#reading in the df
df <-read.csv(paste0("~/Data/FromR/clean_",part_a,part_b,"_2016.csv"),
                           check.names=FALSE, na.strings="null")

Error in file(file, "rt") : cannot open the connection
    In addition: Warning message:
    In file(file, "rt") :
      cannot open file 'C:/Users/myname/Documents/Data/FromR/clean_outsidelate_2016.csv': No such file or directory

如果我按照建议的here 在粘贴的第一部分使用getwd() 代替~,它可以通过在粘贴开始时生成此字符串"C:/Users/myname/Documents/MyR_Projects/Specific_R_project/" 来工作。但是我怎样才能让它与“〜”一起工作?使用~ 时,它会停在“Documents”文件夹...

期望的结果是正确读取文件并执行功能并与其他文件重复。我的循环可以很好地硬编码,我只想让它更通用或软编码。

【问题讨论】:

请包括预期输出。您是否要读取两个文件? getwd() 返回什么? 我更新了问题。现在要解决的问题涉及要读入的单个文件。getwd() 返回工作目录路径中的所有内容,正如我在问题中更正的那样。 【参考方案1】:

我刚刚尝试从另一个 wd 读取我家中的文件 (testFile.txt),它与 ​​~ 一起工作正常

 myFile <- "testFile
 mymy <- ".txt"
 ciao <- read.delim(paste0("~/",myFile,mymy))

在powershell中你可以使用%~%(看看这里tread),但我不知道如何在R中扩展$HOME

#-------- edit

看看here 和here。基本上,.Renviron 中定义的任何变量都应该可以访问。

【讨论】:

修复了我的问题,使其具有正确的文件名。有哪些资源可以检查单个字符符号的处理方式,例如~

以上是关于如何读取具有动态名称的文件,同时避免在 R 中进行硬编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何锁定文件并避免在写入时读取

R基本问题:避免多次使用数据框名称进行添加

如何在 R 中迭代以同时保存多个文件并避免“absolute_path(target) 中的错误:'x' 必须是单个字符串”?

vba - 使用具有“动态创建名称”的变量

R:同时重定向到标准输出和动态文件

如何在 R 中读取具有不同列数的 CSV 文件