努力在函数内循环

Struggling to loop within a function

我正在研究包含 20 个特征变量的数据集中是否存在趋同进化。我需要单独测试每个特征的收敛性,我正在尝试设置一个循环来执行此操作。但是,我在循环中遇到错误,我不确定为什么。我可以完美地运行函数中的每个变量。

我正在使用 windex 包和函数 test.windex。此函数使用 data.frame 包含有关哪些物种是焦点物种以及人们希望测试收敛性的特征的信息。该函数还需要 data.frame.

中包含的物种的系统发育树

为了创建一个可重现的示例,我使用了包 windex 提供的样本数据,因为我的数据是机密的(我有 运行 以下内容,并得到与我自己的数据相同的错误)。

data(sample.data) #data.frame containing the focal species and variables
data(sample.tree) #phylogentic tree
head(sample.data)

  species focals      bm1        bm2      bm3 
1      s4      0 13.03895 17.2201554 11.43644 
2      s7      0 18.22705 15.2427947 22.75245  
3      s8      0 12.38588 10.5858736 13.80216     
4      s9      0 24.79114  8.1148456 23.38717       
5     s11      1 28.20126 -2.9911114 15.63215
6     s12      1 29.45775  0.9225023 12.09184                                                      
    ou1       ou2      ou3     bin                                                                           
1 13.03895 17.220155 11.43644   1                                                                    
2 18.22705 15.242795 22.75245   2                                                                    
3 12.38588 10.585874 13.80216   3                                                                    
4 24.79114  8.114846 23.38717   4                                                                    
5 21.22215 21.936316 20.30037   5                                                                    
6 21.24501 20.952824 20.88650   6

#My loop, it is the traits that I need to loop for each trait variable in the sample.data

sapply(sample.data[3:8], function(x) test.windex(sample.data,sample.tree,traits= x,
focal=sample.data[,2], reps=1000,plot=TRUE,col="light grey"))

此代码生成错误:.subset(x, j) 中的错误:只有 0 可以与负下标混合 调用自:[.data.frame(dat, , traits)

我假设这是某种索引问题,但我似乎找不到解决方法。我尝试了这个,但也出现了同样的错误:

traitsonly<-sample.data[3:8]
sapply(traitsonly, function(x) test.windex(sample.data,sample.tree,traits= x,
focal=sample.data[,2], reps=1000,plot=TRUE,col="light grey"))

如有任何帮助,我们将不胜感激。

test.windex 的帮助页面,它接受列号或列名。

traits Column numbers (or names) of the traits for which you want to calculate a Wheatsheaf index.

所以这些都应该有效。

library(windex)

sapply(3:8, function(x) 
  test.windex(sample.data,sample.tree,traits= x,
              focal=sample.data[,2], reps=1000,plot=TRUE,col="light grey")
) -> plot

或者

sapply(names(sample.data)[3:8], function(x) 
  test.windex(sample.data,sample.tree,traits= x,
              focal=sample.data[,2], reps=1000,plot=TRUE,col="light grey")
) -> plot