【问题标题】:Is there a way to pass an R object to read.csv?有没有办法将 R 对象传递给 read.csv?
【发布时间】:2021-04-13 13:40:36
【问题描述】:

我有一个包中的 R 函数,我需要将文件路径作为参数传递,但它需要一个 csv,而我的文件是一个 xlsx。

我查看了函数的代码,它使用 read.csv 加载文件,但遗憾的是我无法对包进行任何更改。

有没有一种很好的方法来读取 xlsx 并将其传递给函数而不将其写入 csv 并让函数将其读回?

我在这里遇到了 read.csv 的 text 参数: Is there a way to use read.csv to read from a string value rather than a file in R? 这似乎可能是其中的一部分,但正如我所说,我无法更改功能。

【问题讨论】:

  • 我不知道,但我的猜测是,除非您的文件很大(或者您必须执行此操作数千次),否则您最好做“愚蠢”的事情(阅读XLS/写入为 CSV)。您可能能够使用?textConnection 来避免写入文件(或者可能是?file)...
  • 如果您提供了相关的特定功能,会更容易提供帮助。如果函数需要 CSV 文件的路径,而您无法更改函数,则除了编写 CSV 文件之外,您别无选择。

标签: r read.csv


【解决方案1】:

也许您可以构建自己的函数来检查文件是否为xlsx,在这种情况下创建一个临时的csv 文件,将其提供给您的函数,然后将其删除。类似的东西

yourfunction = function(path){
  read.csv(path)
  head(path)
}

library(readxl)

modified_function = function(path){
  if(grepl{"\\.xlsx",path}){
    tmp <- read_xlsx(path)
    tmp_path <- paste0(gsub("\\.xlsx","",path),"_tmp.csv")
    write.csv(tmp,file = tmp_path)
    output <- yourfunction(tmp_path)
    file.remove(tmp_path)
  }else{
    output <- yourfunction(path)
  }
  return(output)
}

如果有帮助,这里可以看看如何只修改一个包的一个功能:How to modify a function of a library in a module

【讨论】:

  • 谢谢。我真的希望避免编写临时 csv,但它开始看起来是最好的选择。我想知道当我发现您可以传递文本时是否还有另一种方法,但看起来该功能需要为此做好准备。太糟糕了,您不能传递“text = read_xlsx”,然后将其从引号中转义。
  • 我不认为你能做到这一点,但我也从来没有挖过很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多