R 如何将树重新缩放到极端形状?

R 如何将树重新缩放到极端形状?,r,loops,tree,data-manipulation,phylogeny,R,Loops,Tree,Data Manipulation,Phylogeny,尽管@jeremycg帮助我开发了以下代码,我还是再次发布了这篇文章。它的工作,但它没有执行我想要的! 一个快速提醒:我有一组树,我需要用一个叫做gamma的因子来测量,如果每个树的值不在定义的范围内,它会被重新缩放,直到它的值在定义的范围内。。。让我们试试这个例子: library(ape) library(phytools) trees<- pbtree(b=1, n=100, nsim=50) fixmytrees <- function(tree, rescaleamt

尽管@jeremycg帮助我开发了以下代码,我还是再次发布了这篇文章。它的工作,但它没有执行我想要的! 一个快速提醒:我有一组树,我需要用一个叫做gamma的因子来测量,如果每个树的值不在定义的范围内,它会被重新缩放,直到它的值在定义的范围内。。。让我们试试这个例子:

library(ape)
library(phytools)

trees<- pbtree(b=1, n=100, nsim=50)

 fixmytrees <- function(tree, rescaleamt = NULL){
if(is.null(rescaleamt)){
rescaleamt <- sample(seq(from = 0.1, to = 0.9, by = 0.1), 1)
} 
if(is.na(gammaStat(tree))){return("bad tree")}
if(gammaStat(tree) < 6){
 return(tree)
 } else {
return(rescale(tree, model ="delta", rescaleamt))
}
}
z<-lapply(tree, fixmytrees) 

 #The script does rescale trees but they are not extreme enough. In this case if you try

 gammaStat(z[[]]) #You would probably see values lower than 6 and sometimes NA!!! 
库(ape)
图书馆(植物醇)

树首先,读取库并创建递归辅助函数:

library(ape)
library(geiger)
fixmytrees <- function(tree, rescaleamt = NULL){
  if(is.null(rescaleamt)){
    rescaleamt <- sample(seq(from = 0.1, to = 0.9, by = 0.1))
  } 
  if(gammaStat(tree) >= 1){
    return(tree)
  } else {
    return(fixmytrees(rescale(tree, "delta", rescaleamt), rescaleamt/2))
  }
}

注意。这对您的数据不是一件明智的事情,因此请确保您知道为什么要这样做

谢谢jeremycg!它不需要另一个循环来遍历树列表吗?不,只需运行
lappy
命令,输出是固定的树,因为gammaStat只接受phyllo对象,我想我们需要一个循环来从multiplyo对象中逐个读取树。也许这就是代码仍然不起作用的原因,对吧?它返回一个列表:
zI在做了一些修改后再次发布了它!偶然错误:较长的对象长度不是较短对象长度的倍数
lapply(trees, fixmytrees)