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语句中传递公式。提前谢谢
答案 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
您可以根据需要更改公式。