是否可以只使用...
参数创建一个函数,然后使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)
答案 0 :(得分:0)
只是为了好玩:
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
显然,有藏龙,你不应该在生产代码中使用它。
答案 1 :(得分:0)
有趣:)
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