2016-04-11 104 views
3

我有3个数据帧,df1,df2,df3。我需要将这些df转换为csv文件。所以,我正在使用write.csv,如下所示,在函数的帮助下。将data.frame写入CSV文件并使用变量名作为文件名

hiveq <- function(f_name){ 
     f_name 
     write.csv(f_name,file=paste(f_name,".csv",sep=""),row.names = FALSE, col.names = FALSE)} 
hiveq("df1") 
hiveq("df2") 
hiveq("df3") 

当我打开csv表,它只显示df1,而不是df1的内容。我怎么能说R,它应该看到Df,而不是字符串。我尝试使用as.name,gsub,as.formula去除f_name变量周围的引号,但不起作用。有人可以帮助我吗?

+3

也许你可以使用'?get' – akrun

+2

你需要区分df的名称和它的内容。上面的代码没有这样做。 – niczky12

回答

4

一个方便的方法是使用“非标准评估”。这里是如何做到这一点的工作你的情况:

hiveq <- function(df) { 
    write.csv(df, file = paste(deparse(substitute(df)),".csv",sep=""), row.names = FALSE, col.names = FALSE) 
} 
hiveq(df1) 
hiveq(df2) 
hiveq(df3) 

这里会发生什么事是,表达deparse(substitute(df))返回包含传递给df将R对象的名称的字符串。所以,当你拨打:

hiveq(df1) 

计算结果为“DF1”和函数的数据帧写入到一个名为“df1.csv”文件。

+0

谢谢。它工作正常。非常感谢 – subro

2

问题是参数write.csv需要一个数据帧,而file参数必须是字符串。所以你有两个选择。

第一种选择:使用get()发现从它的名字数据框:

hiveq <- function(d, env = parent.frame()) { 
    write.csv(get(d, env = env), 
       file = paste0(d,".csv"), 
       row.names = FALSE) 
} 
hiveq("df1") 

您需要在此处设置env参数为parent.frame(),否则get()将解决约到哪里寻找模糊目的。

第二个选项:提供数据帧和使用非标准评价提取其名称:

hiveq <- function(d) { 
    write.csv(d, 
       file = paste0(deparse(substitute(d)), ".csv"), 
       row.names = FALSE) 
} 
hiveq(df1) 

总之,get()会给你下该名称的对象,而deparse(subtitute())组合得到的名称该对象作为一个字符串。