如何使用readr::write\u excel\u csv追加数据而不重复列名?

如何使用readr::write\u excel\u csv追加数据而不重复列名?,r,csv,file-exists,readr,write.table,R,Csv,File Exists,Readr,Write.table,readr::write\u excel\u csv的帮助文件建议使用以下代码: write_excel_csv(x, path, na = "NA", append = TRUE, col_names = !append, delim = ",", quote_escape = "double") 但是,colu name=!追加将创建错误 library(readr) data <- read_csv("col1, col2, col3 a,2,0 b,5,7 c,8,4")

readr::write\u excel\u csv的帮助文件建议使用以下代码:

write_excel_csv(x, path, na = "NA", append = TRUE,
  col_names = !append, delim = ",", quote_escape = "double")
但是,colu name=!追加将创建错误

library(readr)
data <- read_csv("col1, col2, col3
a,2,0
b,5,7
c,8,4")

write_excel_csv(data,"data.csv",append = TRUE, col_names=!append)

>Error in !append : invalid argument type

如何使用write_excel_csv使列名第一次出现而不是随后出现?

我已修改了您的数据以创建数据框:

data <- data.frame(col1=c('a','b','c'), 
                   col2=c(2,5,8),
                   col3=c(0,7,4))
现在,我构建了一个
if
else
语句,查看文件是否存在。如果文件不存在,它将保存一个包含列名的新CSV文件。如果文件确实存在,它将运行
write\u excel\u csv
以将新值附加到现有列中

if(file.exists("data.csv") == TRUE) {
  # If the file exists, run the append code.
  write_excel_csv(data,"data.csv", append=TRUE)
} else { 
  # If it doesn't exist, save the file with the columns included.
  write_excel_csv(data, "data.csv", append=FALSE)
}
如果您运行代码两次,您将在第一次迭代中看到它将保存一个新的CSV,其中数据框包含列标题(假设您已从目录中删除“data.CSV”)。第二次迭代将简单地附加来自dataframe的值,而不附加列标题,从而产生:

  col1   col2  col3
  <chr> <dbl> <dbl>
1 a         2     0
2 b         5     7
3 c         8     4
4 a         2     0
5 b         5     7
6 c         8     4
col1 col2 col3
1A20
2 b 5 7
3 c 8 4
4 a 2 0
5 b 5 7
6 c 8 4

我认为
存在范围问题!追加
。在调用
readr::write\u excel\u csv
之前,R将尝试计算该语句,如果
中没有名为
append
的对象,GlobalEnv
将失败。更糟糕的是,如果您的工作区中碰巧有一个名为
append
的对象,那么该值将用于调用中,这几乎肯定不是您想要的。考虑这一点:

f = function (a = TRUE, b = !a) cat("'a' is", a, "; 'b' is", b, '\n')
f()
## 'a' is TRUE ; 'b' is FALSE 

f(b = !a)
## Error in cat("'a' is", a, "; 'b' is", b, "\n") : object 'a' not found

a = FALSE
f(b = !a)
## 'a' is TRUE ; 'b' is TRUE 
调用函数时,R将首先计算为该函数的参数提供的所有语句,然后使用相应的值进行调用。另一方面,如果未提供具有默认值的参数,则该值将在函数的作用域内进行计算。因此,当
readr::write\u excel\u csv()
计算默认值
时!append
,这发生在函数的范围内,其中应定义
append

现在,默认值是
col\u names=!append
被巧妙地选择为按预期工作,即在不追加时写入标题,可能是写入一个新文件。因此,如果不使用它,只需将
append
的值设置为条件值,它就可以顺利工作:

write_excel_csv(data, 'data1.csv', append=file.exists('data1.csv'))
read_csv('data1.csv')

## Parsed with column specification:
## cols(
##   col1 = col_character(),
##   col2 = col_double(),
##   col3 = col_double()
## )
## # A tibble: 3 x 3
##   col1   col2  col3
##   <chr> <dbl> <dbl>
## 1 a         2     0
## 2 b         5     7
## 3 c         8     4

write_excel_csv(data, 'data1.csv', append=file.exists('data1.csv'))
read_csv('data1.csv')

## Parsed with column specification:
## cols(
##   col1 = col_character(),
##   col2 = col_double(),
##   col3 = col_double()
## )
## # A tibble: 6 x 3
##   col1   col2  col3
##   <chr> <dbl> <dbl>
## 1 a         2     0
## 2 b         5     7
## 3 c         8     4
## 4 a         2     0
## 5 b         5     7
## 6 c         8     4
write\u excel\u csv(数据'data1.csv',append=file.exists('data1.csv'))
读取\u csv('data1.csv')
##使用列规范解析:
##科尔斯(
##col1=col_字符(),
##col2=col_double(),
##col3=col_double()
## )
###tibble:3 x 3
##col1 col2 col3
##     
##1A20
##2 b 5 7
##3 c 8 4
写入\u excel\u csv(数据'data1.csv',append=file.exists('data1.csv'))
读取\u csv('data1.csv')
##使用列规范解析:
##科尔斯(
##col1=col_字符(),
##col2=col_double(),
##col3=col_double()
## )
###tibble:6 x 3
##col1 col2 col3
##     
##1A20
##2 b 5 7
##3 c 8 4
##4 a 2 0
##5 b 5 7
##6 c 8 4

您是否尝试过
col\u names=FALSE
?是。如果col_names=FALSE,则不会显示列名。我希望列名第一次出现,但不是以后出现。使用
append=TRUE,col_names=FALSE
是否正确地将数据追加到CSV?它正确地追加数据,但不追加列名。我希望列名有条件地显示。也就是说,我希望它们在第一次创建文件时出现,而不是在附加新数据时出现。谢谢!是的,我认为你对问题的看法是对的。按照我的编码方式,在计算append参数时,R似乎已经将该文件解释为已经存在,即使该文件是第一次创建的。很高兴为您提供帮助;)像上面那样使用“”和“”有什么区别?据我所知没有区别。我倾向于使用
,只是因为我保存了击键。没有注意到我两个都用了,我会编辑以避免混淆。谢谢
f = function (a = TRUE, b = !a) cat("'a' is", a, "; 'b' is", b, '\n')
f()
## 'a' is TRUE ; 'b' is FALSE 

f(b = !a)
## Error in cat("'a' is", a, "; 'b' is", b, "\n") : object 'a' not found

a = FALSE
f(b = !a)
## 'a' is TRUE ; 'b' is TRUE 
write_excel_csv(data, 'data1.csv', append=file.exists('data1.csv'))
read_csv('data1.csv')

## Parsed with column specification:
## cols(
##   col1 = col_character(),
##   col2 = col_double(),
##   col3 = col_double()
## )
## # A tibble: 3 x 3
##   col1   col2  col3
##   <chr> <dbl> <dbl>
## 1 a         2     0
## 2 b         5     7
## 3 c         8     4

write_excel_csv(data, 'data1.csv', append=file.exists('data1.csv'))
read_csv('data1.csv')

## Parsed with column specification:
## cols(
##   col1 = col_character(),
##   col2 = col_double(),
##   col3 = col_double()
## )
## # A tibble: 6 x 3
##   col1   col2  col3
##   <chr> <dbl> <dbl>
## 1 a         2     0
## 2 b         5     7
## 3 c         8     4
## 4 a         2     0
## 5 b         5     7
## 6 c         8     4