具有公式参数的函数中的R if语句

时间:2017-08-08 03:38:38

标签: r function if-statement

testing<-function(formula=NULL,data=NULL){
  if(with(data,formula)==T){
print('YESSSS')
  }
}
A<-matrix(1:16,4,4)
colnames(A)<-c('x','y','z','gg')
A<-as.data.frame(A)
testing(data=A,formula=(2*x+y==Z))
Error in eval(expr, envir, enclos) : object 'x' not found 
##or I can put formula=(x=1)
##reason that I use formula is because my dataset had different location and I would want
##to 'subset' my data into different set 

这是我的代码的主要流程。我做了一些搜索,似乎没有人问这种愚蠢的问题,或者不可能在if语句中传递公式。提前谢谢

4 个答案:

答案 0 :(得分:0)

如果我们需要评估它,一个选项是eval(parse

testing<-function(formula=NULL,data=NULL){
 data <- deparse(substitute(data))
 if(any(eval(parse(text=paste("with(", data, ",", 
              deparse(substitute(formula)), ")")))))
  print("YESSS")
 }

testing(data=A,formula=(2*x+y==z))
#[1] "YESSS"

答案 1 :(得分:0)

当您在R中调用函数时,它会在执行函数之前首先计算其参数。

例如,prod(2+2, 3)在调用函数prod(4, 3)之前首先变为prod()

因此,在您的代码中,R首先尝试解决(2*x+y==Z)。它失败,因为在功能代码之外没有x对象。所以,它甚至没有开始运行testing()

要正确使用您的功能,您应该向R表明它不应该计算(2*x+y==Z)。相反,它应该按原样传递此信息。您可以使用expression()eval()函数来执行此操作。

testing<-function(formula=NULL,data=NULL){
   if(with(data,eval(formula==T)){
print('YESSSS')
  }
}
A<-matrix(1:16,4,4)
colnames(A)<-c('x','y','z','gg')
A<-as.data.frame(A)
testing(data=A,formula=expression(2*x+y==Z))

但是,您会注意到代码存在其他问题。

  • 因为Z与z不同。请注意,使用z和在公式Z中使用的是in in colnames。

  • if()仅适用于单个值为true或false的情况。在您的情况下,A中的每一行都有一个值。当发生这种情况时,if()只会检查第一行是否符合条件。

如果您的目的是子集,则更容易做到:

  A.subset <- subset(A, 2*A$x+A$y == A$z)

答案 2 :(得分:0)

与我的同事讨论后, 这是一种解决方案

testing<-function(cx,cy,px,py,z,data=NULL){
  list<-NULL
  for(m in 1:nrow(data)){
  if(cx*data$x[m]^px+cy*data$y[m]^py+data$z==0){
    print(m)}
  }
}

但这只能处理多项式并且函数中有很多参数。我想到了一种将它作为一般方程式来减少的方法。或许这是最简单的方程式。

答案 3 :(得分:0)

如果您只是想要数据的subset,请创建一个代表公式的character对象:

formula="2*x+y==z"
testing<-function(data,formula){with(data = data,expr = eval(parse(text = formula)))}
subset(A,testing(A,formula=formula))

#x y  z gg
#2 2 6 10 14

您可以根据需要更改公式。