我知道之前曾提出过非常类似的问题,但我仍然没有从那些较旧的帖子中得到我的确切问题的答案。我的函数'test'需要在数据帧的列'col'上执行 only (实际上来自.csv文件的数据)'x',即
test <- function(x$col){...}
:
test(x$col)
我知道这种语法不起作用。所以我需要这样做:
test <- function(x,col){...}
:
test(x$col)
但上面的问题是,由于R函数固有地通过值传递,整个数据帧'x'被传递给函数'test',这是一种非常有效的方式,特别是一个大的'x' !
解决方法是:
test <- function(y){...}
:
y <- x$col
test(y)
但这并不好。我为一个奇怪的现象添加了一个额外的代码行/向量,我没有看到明显的原因!此外,这使代码的可读性变得复杂,因为代码中的其他地方我对该列使用x$col
。
有没有办法通过使用'x'和'col'的组合(并且没有额外的变量!)作为我的函数'test'的参数来发送列的副本(x$col
) ??
或者有人可以建议一个原因是不能只发送一个列作为函数'test'的参数吗?另外,每次使用x$col
通常效率低下,因为它可能不会一直存在于内存中吗?
答案 0 :(得分:4)
这不起作用:
spam <- function(col) {
return(col*10)
}
dat <- data.frame(bla = 1:10, xi = 1:10)
spam(dat$bla)
我不认为bla
完全传递给函数。看着:
> str(dat$bla)
int [1:10] 1 2 3 4 5 6 7 8 9 10
我怀疑在子设置时会创建一个新对象,并且只传递dat$bla
中的值。或者我在这里完全错了?
答案 1 :(得分:2)
这将取决于你如何调用测试,但其中任何一个都可能是答案:
test <- function(x,col){ x[[col]] } # for x being data.frame or list
test <- function(x,col){ x[ , col] } # for x being data.frame or matrix
在向函数传递参数时,应避免使用“$”运算符,因为它不会将“col”的值转换为其他值。它试图以“col”的名称返回一列,这通常不是你将一个参数传递给一个函数时的结果。另一方面,“[”和“[[”函数将评估col
并使用您传递的值进行提取。
如果您只想处理一个列,那么这也是可能的:
test <- with(x, function(col) {col} )
# obviously you could do more with col inside the braces
with
函数设置一个环境,其中“col”将被解释为有效的对象名称。
答案 2 :(得分:1)
我不确定,但这是你想要的吗?
#Your Data Frame
x<-data.frame(matrix(rnorm(25),ncol=5))
x
#A Function to text Something, you choose the data and the columm
test.function<- function(data.frame,columm) {
data.frame[,columm]>0
}
#Work either with the number of the columm
test.function(x,1)
#or de "name" of the columm
test.function(x,"X1")