所有。当我今天编写代码时,我发现了一个有趣但令人困惑的事情。我写了一个非常简单的函数如下:
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
对象,这是真的吗?谁能告诉我如何解决这个问题?非常感谢!
答案 0 :(得分:1)
这里有一些问题:
name
在本地函数环境中创建一个名为name
的对象。 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参数更改为合适的值。有关如何构建搜索路径的?search
和TRUE
的更多信息。
旁注:永远不要使用T和F作为FALSE
和> isTRUE(T)
[1] TRUE
> T <- 0
> isTRUE(T)
[1] FALSE
的缩写:
T
在过去,我打破了作者愚蠢的软件包,使用F
和<li id="#example"></li>
完成此操作。幸运的是,CRAN包中不再允许这样做。