使用paste函数生成字符向量实现自动邮件附件失败,该如何处理?
我编写了如下代码来生成邮件附件路径的字符向量:
attach.files = c(paste("/users/joesmith/nosection_", currentDate,".csv",sep=""), paste("/users/joesmith/withsection_", currentDate,".csv",sep=""))
若手动构造字符向量:
c("nosection_051418.csv", "withsection_051418.csv")
则能正常实现邮件附件添加,但由于需要每日自动运行程序,无法手动完成该操作。使用paste函数拼接日期生成的字符向量却无法生效,请问如何调整才能让该字符向量被正常识别,以实现自动邮件附件功能?
嘿,我来帮你排查下这个问题!你遇到的情况很常见,手动写路径没问题,但用paste拼接就失效,大概率是日期格式不匹配或者路径生成有细节问题,咱们一步步来解决:
先确认
currentDate的格式是否正确
你手动写的日期是051418(两位月+两位日+两位年),但如果currentDate的格式是2018-05-14、2018/05/14或者May 14 2018这类,用paste拼接后生成的路径就会和实际文件路径不匹配,自然找不到文件。
解决办法是用format()函数把日期转换成你需要的格式:# 假设currentDate是Sys.Date()或其他日期类型 currentDate <- format(Sys.Date(), "%m%d%y") # 再生成路径 attach.files <- c( paste("/users/joesmith/nosection_", currentDate, ".csv", sep = ""), paste("/users/joesmith/withsection_", currentDate, ".csv", sep = "") )%m%d%y会输出两位月份+两位日期+两位年份,正好对应你手动写的051418格式。检查生成的路径是否真的存在
有时候日期格式对了,但可能文件保存的路径和你写的不一致,或者文件还没生成。你可以运行以下代码验证:# 打印生成的路径,看和手动写的有什么差异 print(attach.files) # 检查每个路径对应的文件是否存在 sapply(attach.files, file.exists)如果输出里有
FALSE,说明对应的文件不存在,需要调整路径或者确认文件生成逻辑。用更直观的方式拼接路径
其实可以不用paste,用stringr包的str_glue()函数,语法更清晰,不容易出错:library(stringr) currentDate <- format(Sys.Date(), "%m%d%y") attach.files <- c( str_glue("/users/joesmith/nosection_{currentDate}.csv"), str_glue("/users/joesmith/withsection_{currentDate}.csv") )或者用R基础包的
file.path(),它会自动处理路径分隔符,跨平台更友好:currentDate <- format(Sys.Date(), "%m%d%y") attach.files <- c( file.path("/users/joesmith", paste0("nosection_", currentDate, ".csv")), file.path("/users/joesmith", paste0("withsection_", currentDate, ".csv")) )确认邮件函数的参数要求
少数情况下,邮件函数可能对路径的格式有特殊要求(比如需要绝对路径、不能有转义字符),你可以把手动写的路径和生成的路径做个对比,用str_view()(同样在stringr包里)查看是否有隐藏的差异:str_view(attach.files, "nosection_")
按照上面的步骤排查,应该就能解决自动生成路径失效的问题啦!
内容的提问来源于stack exchange,提问作者user9302275

