使用R编写一个读取文件的函数

时间:2017-04-03 21:01:28

标签: r function

所有。当我今天编写代码时,我发现了一个有趣但令人困惑的事情。我写了一个非常简单的函数如下:

read_data <- function(x,name){
        a <- paste0(x, ".csv")
        name <- read.csv(a, header = T, sep = ",", stringsAsFactors = F)
}

(我正在为一个小实验写这个函数,这是愚蠢的,我承认)

例如,我有一个名为&#34; age.csv&#34;的文件。在工作目录中。我使用上面的函数调用:

read_data("age",age)

运行此代码时没有警告或错误。我认为应该有一个名为age的对象出现在我的工作环境中。但没有任何事情发生。是read_data函数创建保留在本地环境而不是全局环境中的age对象,这是真的吗?谁能告诉我如何解决这个问题?非常感谢!

1 个答案:

答案 0 :(得分:1)

这里有一些问题:

  • 参数name在本地函数环境中创建一个名为name的对象。
  • 函数的第二行用read.csv的调用结果覆盖该对象name
  • 该分配的结果无形地返回但未存储。所以从本质上讲,你的函数创建了一个字面上称为read_data <- function(x,name){ cat("Name object: \n",name,"\n") name <- read.csv(x) cat("new name object: \n") print(name) cat("\n") } 的数据框,然后再次删除它。

看看以下代码的结果:

afile <- textConnection("A,B,C
                        1,1,1
                        1,2,3
                        3,2,1")
read_data(afile,"age")
#> Name object: 
#>  age 
#> new name object: 
#>   A B C
#> 1 1 1 1
#> 2 1 2 3
#> 3 3 2 1

试一试:

read.csv()

我真的不明白你为什么这样做,因为你可以使用assign()并将结果存储在一个对象中。正如评论中所说的那样,尝试在当前环境之外分配值是危险的,而且在没有充分理由的情况下你不应该这样做。如果你不知道何时何时不知道,你就没有充分的理由而且你不应该尝试这样做。

但如果必须,您需要使用read_data <- function(x,name){ tmp <- read.csv(x) assign(name, tmp, pos = ".GlobalEnv") } 功能:

?assign

请注意,我必须在全局环境中指定此分配。如果这不是您想要的行为,请将pos参数更改为合适的值。有关如何构建搜索路径的?searchTRUE的更多信息。

旁注:永远不要使用T和F作为FALSE> isTRUE(T) [1] TRUE > T <- 0 > isTRUE(T) [1] FALSE 的缩写:

T

在过去,我打破了作者愚蠢的软件包,使用F<li id="#example"></li>完成此操作。幸运的是,CRAN包中不再允许这样做。