我不得不使用下面的代码,但我不完全理解它是如何工作的。如果我把du.4改成du.f,然后在调用函数时使用f,为什么它不起作用?出于某种原因,它只适用于数字,我不明白为什么。
这是它在du.f的情况下给出的错误
Error in paste("Meth1=", nr, ".ps", sep = "") : object 'f' not founddu.4 <- function(u,v,a){(exp(a)*(-1+exp(a*v)))/(-exp(a)+exp(a+a*u)-exp(a*(u+v))+exp(a+a*v))}
plotmeth1 <- function(data1,data2,alpha,nr) {
psfile <-paste("Meth1=",nr,".ps",sep="")
diffmethod <-paste("du.",nr,sep="")
title=paste("Family",nr)
alphavalue <-paste("alpha=",round(alpha,digits=3),sep="")
#message=c("no message")
postscript(psfile)
data3<-sort(eval(call(diffmethod,data1,data2,alpha)))
diffdata <-data3[!is.na(data3)]
#if(length(data3)>length(diffdata))
#{message=paste("Family ",nr,"contains NA!")}
tq <-((1:length(diffdata))/(length(diffdata)+1))
plot(diffdata,tq,main=title,xlab="C1[F(x),G(y)]",ylab="U(0,1)",type="l")
legend(0.6,0.3,c(alphavalue))
abline(0,1)
#dev.off()
}发布于 2020-06-13 23:13:15
在R中,点只用作标识符中的另一个字符。为了清晰起见,它经常被使用,但在将点之后的部分定义为由点之前的标识符部分给定的名称空间中时,没有正式的函数。在像du.f这样的东西中,您不能仅通过f来引用函数,即使您的计算是在名为du的环境中进行的。当然,您可以定义一个名为du.4的函数,然后单独使用4,但是这样做时,您使用的数字4只是一个数字,而不是对该函数的引用。例如,如果
du.4 <- function(u,v,a){(exp(a)*(-1+exp(a*v)))/(-exp(a)+exp(a+a*u)-exp(a*(u+v))+exp(a+a*v))}则du.4(1,2,3)的计算结果为21.08554,但尝试使用4(1,2,3)时会抛出错误
Error: attempt to apply non-function在您的代码中,您将使用paste将函数名组装为要传递给eval的字符串。将文字数字4粘贴到字符串'du.'上是有意义的(因为粘贴会将4转换为字符串'4'),但是将一个未定义的f粘贴到'du.'上则没有意义。但是,将文字字符串'f'粘贴到'du.'上是有意义的,这样即使plotmeth1 (data1, data2, alpha, f)失败,函数调用plotmeth1 (data1, data2, alpha, 'f')也能正常工作。
有关在R标识符中使用点的更多信息,请参阅this question。
https://stackoverflow.com/questions/62360953
复制相似问题