我正在尝试将两个文件路径作为参数传递给函数。但它不接受输入。这就是我正在做的事情:
partition<-function(d1,p2){
d1<-read.table(file = d1, fill = TRUE)
p2<-read.table(file = p2, fill = TRUE)
}
并且在调用函数时:
partition("samcopy.txt","partcopy.txt")
函数内部的变量没有读取.txt。如何让变量读表?
答案 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)
。这非常危险!您之前分配的一个对象现在是另一回事,您甚至都不会对此更改发出警告。
然而,我提出的方法不会出现同样的问题。我强烈建议你养成使用这种方法的习惯!如果您没有任何功能,可以在您不知情的情况下更改全局环境中的内容。
如需了解更多信息,请阅读this,this或只是谷歌“无副作用的功能”
仅供参考,您的代码还存在其他一些问题。首先,您需要告诉您的功能返回什么。你所做的只是调用一个函数,将东西分配给本地环境,然后关闭该函数。函数将始终返回最后一行(只要它不是赋值)。这就是为什么在我的例子中,我将res
作为函数的最后一行。此外,您没有正确分配您的对象。您将d1 <- "text.txt"
之类的字符串传递给您的函数,然后让您的函数执行以下操作"text.txt" <- read.table("text.txt",...)
。这根本没有意义。您需要将read.table
的输出分配给对象。在我的示例中,我将它们分配给a
和b
。