Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写以向量或公式作为第一个参数的R函数?_R_Function - Fatal编程技术网

如何编写以向量或公式作为第一个参数的R函数?

如何编写以向量或公式作为第一个参数的R函数?,r,function,R,Function,我在写一个函数,我希望能够把向量和公式作为第一个参数。如果它是一个向量,我做一些单变量计算,如果它是一个公式,我用第二个变量分析第一个变量(第二个变量总是一个因子) 这是我目前的代码: fun = function(formula,data) { if (class(with(data,formula))=="formula") { mod = model.frame(formula,data) n.group=names(mod)[2] group <-

我在写一个函数,我希望能够把向量和公式作为第一个参数。如果它是一个向量,我做一些单变量计算,如果它是一个公式,我用第二个变量分析第一个变量(第二个变量总是一个因子)

这是我目前的代码:

fun = function(formula,data) {

  if (class(with(data,formula))=="formula") {
    mod = model.frame(formula,data)
    n.group=names(mod)[2] 
    group <- eval(parse(text=paste("mod$",n.group,sep=""))) #x
    response <- model.response(mod) # y
    return(table(response,group))
  }

  else {
    return(table(with(data,formula)))
  }
}

data(iris)

fun(Sepal.Length~Species,iris) # works correctly
fun(Sepal.Length,iris) # returns an error
fun=函数(公式、数据){
if(类(带(数据、公式))=“公式”){
mod=模型框架(公式、数据)
n、 组=名称(mod)[2]
组试试这个:

fun.formula <- function(formula, data) {
  mod = model.frame(formula, data)
  n.group <- names(mod)[2] 
  group <- eval(parse(text=paste("mod$",n.group,sep=""))) #x
  response <- model.response(mod) # y
  table(response, group)
}

fun <- function(formula, data) {
    ret <- try( table(eval(substitute(formula), data), silent = TRUE)
    if (inherits(try, "try-error)) fun.formula(formula, data) else ret
}

# tests
fun(Sepal.Length ~ Species, iris)
fun(Sepal.Length, iris)

fun.formula理想情况下,我会使用S3方法解决这个问题,但我不知道如何解决。以下是完成这项工作的方法:

fun <- function(x,data) {
  mod = try(model.frame(x,data),silent=T)
  if (inherits(mod, "try-error")) {
    x=data[,deparse(substitute(x))]
    return(table(x))
  }
  else {
    mod = model.frame(x,data)
    n.group=names(mod)[2] 
    group <- eval(parse(text=paste("mod$",n.group,sep=""))) #x
    response <- model.response(mod) # y
    return(table(response,group))    
  }
}

fun(Sepal.Length~Species,iris) # works correctly
fun(Sepal.Length,iris) # works!

fun
with(fun(Sepal.Length,iris))
,“eval中的错误(expr,envir,enclose):对象'Sepal.Length'未找到”应该是错误的一个很好的指示。对不起,
with(iris,fun(Sepal.Length,iris))
谢谢您的回复-它把我推向了正确的方向!
fun <- function(x,data) {
  mod = try(model.frame(x,data),silent=T)
  if (inherits(mod, "try-error")) {
    x=data[,deparse(substitute(x))]
    return(table(x))
  }
  else {
    mod = model.frame(x,data)
    n.group=names(mod)[2] 
    group <- eval(parse(text=paste("mod$",n.group,sep=""))) #x
    response <- model.response(mod) # y
    return(table(response,group))    
  }
}

fun(Sepal.Length~Species,iris) # works correctly
fun(Sepal.Length,iris) # works!