【问题标题】:R variable not found, but specifically defined未找到 R 变量,但已明确定义
【发布时间】:2023-03-16 15:43:01
【问题描述】:

我编写了一个函数来运行系统发育广义最小二乘法,一切看起来都应该可以正常工作,但由于某种原因,脚本中定义的特定变量 (W) 不断出现未定义。我已经盯着这段代码看了好几个小时,无法弄清楚问题出在哪里。

有什么想法吗?

myou <- function(alpha, datax, datay, tree){
    data.frame(datax[tree$tip.label,],datay[tree$tip.label,],row.names=tree$tip.label)->dat
    colnames(dat)<-c("Trait1","Trait2")
    W<-diag(vcv.phylo(tree)) # Weights
    fm <- gls(Trait1 ~ Trait2, data=dat, correlation = corMartins(alpha, tree, fixed = TRUE),weights = ~ W,method = "REML")
    return(as.numeric(fm$logLik))
}

corMartins2<-function(datax, datay, tree){
    data.frame(datax[tree$tip.label,],datay[tree$tip.label,],row.names=tree$tip.label)->dat
    colnames(dat)<-c("Trait1","Trait2")
    result <- optimize(f = myou, interval = c(0, 4), datax=datax,datay=datay, tree = tree, maximum = TRUE)
    W<-diag(vcv.phylo(tree)) # Weights
    fm <- gls(Trait1 ~ Trait2, data = dat, correlation = corMartins(result$maximum, tree, fixed =T),weights = ~ W,method = "REML")
    list(fm, result$maximum)}




#test


require(nlme)
require(phytools)
simtree<-rcoal(50)
as.data.frame(fastBM(simtree))->dat1
as.data.frame(fastBM(simtree))->dat2

corMartins2(dat1,dat2,tree=simtree)

返回“eval(expr, envir, enclos) 中的错误:找不到对象‘W’”

尽管 W 是明确定义的!

谢谢!

【问题讨论】:

  • lowerBupperB 是什么?
  • 调试无法在自己的计算机上运行的代码是我通常要避免的特殊地狱循环。
  • 您可能希望在corMartins2() 函数中使用cbind(dat, W)。我认为gls()dat data.frame 中寻找W,但没有找到。
  • 抱歉,我删除了 lowerB 和 upperB 并用硬编码值替换了它们。此外,这应该是一个可运行的脚本。

标签: r function


【解决方案1】:

myoucorMatrins2 中的gls 调用中发生错误:您必须将W 作为dat 中的一列传入,因为gls 正在那里寻找它(当您输入@ 987654327@ 像这样的公式,它会查找 dat$W 并找不到它)。

只需将两个函数中的data=dat 更改为data=cbind(dat,W=W)

【讨论】:

  • 感谢您的修复!这完全有道理!
【解决方案2】:

这个例子对我来说是不可重现的,因为 lowerBupperB 没有定义,但是,也许以下内容对你有用,cbinding datW

myou <- function(alpha, datax, datay, tree){
    data.frame(datax[tree$tip.label,],datay[tree$tip.label,],row.names=tree$tip.label)->dat
    colnames(dat)<-c("Trait1","Trait2")
    W<-diag(vcv.phylo(tree)) # Weights
            ### cbind W to dat
            dat <- cbind(dat, W = W)
    fm <- gls(Trait1 ~ Trait2, data=dat, correlation = corMartins(alpha, tree, fixed = TRUE),weights = ~ W,method = "REML")
    return(as.numeric(fm$logLik))
}

corMartins2<-function(datax, datay, tree){
    data.frame(datax[tree$tip.label,],datay[tree$tip.label,],row.names=tree$tip.label)->dat
    colnames(dat)<-c("Trait1","Trait2")
    result <- optimize(f = myou, interval = c(lowerB, upperB), datax=datax,datay=datay, tree = tree, maximum = TRUE)
    W<-diag(vcv.phylo(tree)) # Weights
    ### cbind W to dat
    dat <- cbind(dat, W = W)
    fm <- gls(Trait1 ~ Trait2, data = dat, correlation = corMartins(result$maximum, tree, fixed =T),weights = ~ W,method = "REML")
    list(fm, result$maximum)}




#test
require(phytools)
simtree<-rcoal(50)
as.data.frame(fastBM(simtree))->dat1
as.data.frame(fastBM(simtree))->dat2

corMartins2(dat1,dat2,tree=simtree)

【讨论】:

  • 是的,这就是问题所在...感谢您花时间帮助我!
猜你喜欢
  • 2020-07-23
  • 2020-12-25
  • 2018-08-06
  • 2020-11-04
  • 2020-11-30
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多