R:如何将两个文件路径作为参数传递给函数?

时间:2016-09-12 22:15:37

标签: r function file

我正在尝试将两个文件路径作为参数传递给函数。但它不接受输入。这就是我正在做的事情:

partition<-function(d1,p2){

     d1<-read.table(file = d1, fill = TRUE)
     p2<-read.table(file = p2, fill = TRUE) 

}

并且在调用函数时:

partition("samcopy.txt","partcopy.txt")

函数内部的变量没有读取.txt。如何让变量读表?

2 个答案:

答案 0 :(得分:0)

使用超级赋值运算符&lt;&lt; -

partition<-function(d1,p2){
     d1 <<- read.table(file = d1, fill = TRUE)
     p2 <<- read.table(file = p2, fill = TRUE) 
}

答案 1 :(得分:0)

AidanGawronSki的方法有效,但从编程的角度来看应该避免!这是对您的问题的更传统的答案。

partition<-function(d1,p2){
     a <- read.table(file = d1, fill = TRUE)
     b <- read.table(file = p2, fill = TRUE) 
     res <- list(a,b)
     names(res) <- c(d1,p2)
     res
}

要理解为什么上述方法“更好”,了解哪些环境更为重要,更重要的是了解R范围规则。环境本质上就是您的工作空间。例如,当您首次打开R并开始分配对象时,这些对象将存储在全局环境中。另一个环境示例是当您调用函数时,该函数会创建自己的环境,该环境由您传递给函数的任何参数组成。通过这样做,R确保当你调用一个函数时,它没有“副作用”或说另一种方式它不会影响全局环境。

让我举个例子。想象一下,您开始R会话,并在全局环境中分配d1 <- 1。您将在以后的分析中使用d1,如果在您不知情的情况下进行更改,那将是一种耻辱,对吗?

如果您在致电

时使用AidanGawronSki的方法
partition<-function(d1,p2){
 d1 <<- read.table(file = d1, fill = TRUE)
}

全球环境中的d1将更改为read.table(file = d1, fill = TRUE)。这非常危险!您之前分配的一个对象现在是另一回事,您甚至都不会对此更改发出警告。

然而,我提出的方法不会出现同样的问题。我强烈建议你养成使用这种方法的习惯!如果您没有任何功能,可以在您不知情的情况下更改全局环境中的内容。

如需了解更多信息,请阅读thisthis或只是谷歌“无副作用的功能”

仅供参考,您的代码还存在其他一些问题。首先,您需要告诉您的功能返回什么。你所做的只是调用一个函数,将东西分配给本地环境,然后关闭该函数。函数将始终返回最后一行(只要它不是赋值)。这就是为什么在我的例子中,我将res作为函数的最后一行。此外,您没有正确分配您的对象。您将d1 <- "text.txt"之类的字符串传递给您的函数,然后让您的函数执行以下操作"text.txt" <- read.table("text.txt",...)。这根本没有意义。您需要将read.table的输出分配给对象。在我的示例中,我将它们分配给ab