是否有可能只使用...
参数的函数,但使R识别什么是data.frame,什么是列,无论将它们传递给函数的顺序如何?例如,不是使用:mean(data$column)
,而是使用mean(...)
,其中...
将是(data, column)
或(column, data)
。
我想也许eval
可以工作,但仍然停。任何建议都将非常感谢。
f <- function(...)
{
args <- list(...)
x <-eval(substitute(...), ..., parent.frame())
mean(x)
}
f(women, height)
f(height, women)
只是为了好玩:
f <- function(...)
{
a <- as.list(match.call())
stopifnot(length(a) == 3L)
x <- a[[2]]
y <- a[[3]]
x <- as.character(x)
y <- as.character(y)
tryCatch(get(x, get(y)),
error = function(e) tryCatch(get(y, get(x)),
error = function(e) {
message("no deal")
NULL
}
)
)
}
f(height, women)
#[1] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
f(women, height)
#[1] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
f(women, age)
#no deal
#NULL
f(men, height)
#no deal
#NULL
显然,有龙隐藏,你不应该在产品代码中使用这个
Fun:)
set.seed( 1 )
women <- data.frame( height = rnorm( 100, 1.70, 0.1 ) )
f <- function(...){
args <-as.list( match.call( ) )
cmnd_a <- paste0("a <- try(class(",args[[ 2 ]],"), silent = TRUE)" )
a <- eval( parse( text = cmnd_a ) )
if( a == "data.frame" ){
cmnd <- paste0("mean(",args[[2]],"$",args[[3]],")")
}else{
cmnd <- paste0("mean(",args[[3]],"$",args[[2]],")")}
eval( parse( text = cmnd ) )
}
>
> f(height, women)
[1] 1.710889
>
> f(women, height)
[1] 1.710889