我正在通过R
中的各行代码进行解析,以更好地理解大型函数。虽然我知道sapply
在矢量上具有Apple函数,但是我在理解它在特定实例中的功能时遇到了麻烦。不幸的是,我在其他地方找不到关于这个确切问题的明确解释。
如果使用下面的代码示例模拟数据,则变量Y
是具有2000个值的向量,而calc_sizes
是Y中的唯一值数量(87个唯一值)。将sapply
应用于likelihoods
时,将在likelihoods[calc_sizes]<-sapply(calc_sizes, nb.likelihood)
的上下文中完成。这将返回688个值的向量
sapply
在这里做什么,为什么/为什么返回688而不是87的向量?
要清楚,代码运行正常-没有技术问题。我只喜欢了解和学习,而不是盲目地编写最终可以工作的代码(因此,我不必经常打扰这个论坛)。
您应该能够逐字复制并粘贴代码以获得提及的结果。谢谢您的见解!
#################################################################
#Functions that are needed to generate and apply to sample data
#################################################################
bp <- function(gens=20, init.size=1, offspring, ...){
Z <- list() #initiate the list
Z[[1]] <- init.size #set the first position of the list as the number of index cases
i <- 1
while(sum(Z[[i]]) > 0 && i <= gens) {
Z[[i+1]] <- offspring(sum(Z[[i]]), ...)
i <- i+1
}
return(Z)
}
nb.likelihood<-function(x){
lgamma(k*x+(x-1))-(lgamma(k*x)+lgamma(x+1))+(x-1)*log(r0/k)-(k*x+(x-1))*log(1+r0/k)
}
####################
#Generate sample data
####################
set.seed(123)
Z<-replicate(n=2000,bp(offspring=rnbinom,mu=0.9,size=0.25))
Y<-unlist(lapply(Z,function(x) sum(unlist(x))))
#Generate variables in question
calc_sizes<-unique(c(1,Y))
likelihoods<-c()
#########################
#line of code in question
#########################
likelihoods[calc_sizes]<-sapply(calc_sizes, nb.likelihood)
让我给您展示一个简单的示例,希望它使事情更容易理解。
假设v
是具有从1
到10
的值的向量,并且idx
是v
的索引的子集,其中函数func
将根据以下内容对v
执行某些替换操作到idx
。
v <- 1:10
idx <- 2:6
func <- function(k) -v[k]**2
到目前为止,v
中的内容如下:
> v
[1] 1 2 3 4 5 6 7 8 9 10
然后,使用sapply(idx, func)
将功能func
应用于idx
中的每个元素,即c(-v[2]^2,-v[3]^2,-v[4]^2,-v[5]^2,-v[6]^2)
将从sapply(idx, func)
中输出。
最后,输出将分配给v[idx]
以代替原始值
v[idx] <- sapply(idx, func)
然后您可以看到
> v
[1] 1 -4 -9 -16 -25 -36 7 8 9 10
[进行likelihoods[calc_sizes] <- sapply(calc_sizes, nb.likelihood)
时,您要将sapply(calc_sizes, nb.likelihood)
的结果保存到位置likelihoods
上的矢量calc_sizes
中。
由于calc_sizes
的值从1到688,R将likelihoods
转换为688长度向量。但是,如果您运行table(is.na(calc_sizes))
,您只会看到不缺少87个位置。
[专门回答688的原因是,您正在通过从calc_size
的值到空向量likelihoods
的无序索引分配值。具体地,calc_sizes
包括87个整数值。请注意,最小项是1,最大项是688。
calc_sizes
[1] 1 40 2 3 180 4 19 21 10 49 6 18 5 11 81 23 186 189 8
[20] 41 27 20 7 12 68 9 25 16 131 15 51 26 22 17 648 24 30 32
[39] 28 36 53 96 47 14 548 109 38 31 99 106 34 39 607 100 233 42 66
[58] 129 33 170 102 70 13 46 63 79 97 447 460 688 346 130 44 69 620 113
[77] 92 256 153 78 462 325 61 64 54 76 86
但是,您想要的sapply
也包含87:
sapply(calc_sizes, nb.likelihood)
[1] -1.098612 -11.788381 -2.602690 -3.413620 -30.541489 -4.001407
[7] -8.187640 -8.575276 -6.146104 -13.154588 -4.881330 -7.987619
[13] -4.475865 -6.410490 -17.680645 -8.948901 -31.297439 -31.674821
[19] -5.565697 -11.943435 -9.663029 -8.383385 -5.240275 -6.661805
[25] -15.886160 -5.865802 -9.310881 -7.572668 -24.292698 -7.356445
[31] -13.450466 -9.488087 -8.763676 -7.782825 -87.586858 -9.131222
[37] -10.175841 -10.509013 -9.835872 -11.158148 -13.744013 -19.702968
[43] -12.856183 -7.133302 -75.557026 -21.425116 -11.475373 -10.343221
[49] -20.102594 -21.029806 -10.836219 -11.632377 -82.659672 -20.235490
[55] -37.171587 -12.097586 -15.605646 -24.034010 -10.673316 -29.277798
[61] -20.500835 -16.165367 -6.902190 -12.705964 -15.182243 -17.407459
[67] -19.836336 -63.355209 -64.929415 -92.388061 -51.074698 -24.163398
[73] -12.403344 -16.025922 -84.222650 -21.950431 -19.167825 -40.021951
[79] -27.117199 -17.270506 -65.171492 -48.507264 -14.898089 -15.323743
[85] -13.889967 -16.995849 -18.359679
因此,在您的分配中,您正在按索引位置分配sapply
的值,并逐元素展开。
likelihoods[calc_sizes] <- sapply(calc_sizes, nb.likelihood)
likelihoods
[1] -1.098612 -2.602690 -3.413620 -4.001407 -4.475865 -4.881330
[7] -5.240275 -5.565697 -5.865802 -6.146104 -6.410490 -6.661805
[13] -6.902190 -7.133302 -7.356445 -7.572668 -7.782825 -7.987619
[19] -8.187640 -8.383385 -8.575276 -8.763676 -8.948901 -9.131222
[25] -9.310881 -9.488087 -9.663029 -9.835872 NA -10.175841
[31] -10.343221 -10.509013 -10.673316 -10.836219 NA -11.158148
[37] NA -11.475373 -11.632377 -11.788381 -11.943435 -12.097586
[43] NA -12.403344 NA -12.705964 -12.856183 NA
[49] -13.154588 NA -13.450466 NA -13.744013 -13.889967
[55] NA NA NA NA NA NA
[61] -14.898089 NA -15.182243 -15.323743 NA -15.605646
[67] NA -15.886160 -16.025922 -16.165367 NA NA
[73] NA NA NA -16.995849 NA -17.270506
[79] -17.407459 NA -17.680645 NA NA NA
[85] NA -18.359679 NA NA NA NA
[91] NA -19.167825 NA NA NA -19.702968
[97] -19.836336 NA -20.102594 -20.235490 NA -20.500835
[103] NA NA NA -21.029806 NA NA
[109] -21.425116 NA NA NA -21.950431 NA
[115] NA NA NA NA NA NA
[121] NA NA NA NA NA NA
[127] NA NA -24.034010 -24.163398 -24.292698 NA
[133] NA NA NA NA NA NA
[139] NA NA NA NA NA NA
[145] NA NA NA NA NA NA
[151] NA NA -27.117199 NA NA NA
[157] NA NA NA NA NA NA
[163] NA NA NA NA NA NA
[169] NA -29.277798 NA NA NA NA
[175] NA NA NA NA NA -30.541489
[181] NA NA NA NA NA -31.297439
[187] NA NA -31.674821 NA NA NA
[193] NA NA NA NA NA NA
[199] NA NA NA NA NA NA
[205] NA NA NA NA NA NA
[211] NA NA NA NA NA NA
[217] NA NA NA NA NA NA
[223] NA NA NA NA NA NA
[229] NA NA NA NA -37.171587 NA
[235] NA NA NA NA NA NA
[241] NA NA NA NA NA NA
[247] NA NA NA NA NA NA
[253] NA NA NA -40.021951 NA NA
[259] NA NA NA NA NA NA
[265] NA NA NA NA NA NA
[271] NA NA NA NA NA NA
[277] NA NA NA NA NA NA
[283] NA NA NA NA NA NA
[289] NA NA NA NA NA NA
[295] NA NA NA NA NA NA
[301] NA NA NA NA NA NA
[307] NA NA NA NA NA NA
[313] NA NA NA NA NA NA
[319] NA NA NA NA NA NA
[325] -48.507264 NA NA NA NA NA
[331] NA NA NA NA NA NA
[337] NA NA NA NA NA NA
[343] NA NA NA -51.074698 NA NA
[349] NA NA NA NA NA NA
[355] NA NA NA NA NA NA
[361] NA NA NA NA NA NA
[367] NA NA NA NA NA NA
[373] NA NA NA NA NA NA
[379] NA NA NA NA NA NA
[385] NA NA NA NA NA NA
[391] NA NA NA NA NA NA
[397] NA NA NA NA NA NA
[403] NA NA NA NA NA NA
[409] NA NA NA NA NA NA
[415] NA NA NA NA NA NA
[421] NA NA NA NA NA NA
[427] NA NA NA NA NA NA
[433] NA NA NA NA NA NA
[439] NA NA NA NA NA NA
[445] NA NA -63.355209 NA NA NA
[451] NA NA NA NA NA NA
[457] NA NA NA -64.929415 NA -65.171492
[463] NA NA NA NA NA NA
[469] NA NA NA NA NA NA
[475] NA NA NA NA NA NA
[481] NA NA NA NA NA NA
[487] NA NA NA NA NA NA
[493] NA NA NA NA NA NA
[499] NA NA NA NA NA NA
[505] NA NA NA NA NA NA
[511] NA NA NA NA NA NA
[517] NA NA NA NA NA NA
[523] NA NA NA NA NA NA
[529] NA NA NA NA NA NA
[535] NA NA NA NA NA NA
[541] NA NA NA NA NA NA
[547] NA -75.557026 NA NA NA NA
[553] NA NA NA NA NA NA
[559] NA NA NA NA NA NA
[565] NA NA NA NA NA NA
[571] NA NA NA NA NA NA
[577] NA NA NA NA NA NA
[583] NA NA NA NA NA NA
[589] NA NA NA NA NA NA
[595] NA NA NA NA NA NA
[601] NA NA NA NA NA NA
[607] -82.659672 NA NA NA NA NA
[613] NA NA NA NA NA NA
[619] NA -84.222650 NA NA NA NA
[625] NA NA NA NA NA NA
[631] NA NA NA NA NA NA
[637] NA NA NA NA NA NA
[643] NA NA NA NA NA -87.586858
[649] NA NA NA NA NA NA
[655] NA NA NA NA NA NA
[661] NA NA NA NA NA NA
[667] NA NA NA NA NA NA
[673] NA NA NA NA NA NA
[679] NA NA NA NA NA NA
[685] NA NA NA -92.388061
注意calc_size
的第70个项是688,sapply(calc_sizes, nb.likelihood)
的第70个项是-92.38806(上面的最后一个数值)。
calc_sizes[70]
# [1] 688
sapply(calc_sizes, nb.likelihood)[70]
# [1] -92.3880
要解决,请沿着calc_sizes
的长度进行分配,以1:87
进行分配。另外,考虑用长度初始化likelihoods
,而不要在c()
之后增加对象。
likelihoods <- vector(mode="numeric", length=length(calc_sizes))
likelihoods[seq_along(calc_sizes)] <- sapply(calc_sizes, nb.likelihood)
# likelihoods[1:length(calc_sizes)] <- sapply(calc_sizes, nb.likelihood)
尽管如此,对于应用族函数,由于它们返回值,因此可以直接直接赋值给它
likelihoods <- sapply(calc_sizes, nb.likelihood)
likelihoods
[1] -1.098612 -11.788381 -2.602690 -3.413620 -30.541489 -4.001407
[7] -8.187640 -8.575276 -6.146104 -13.154588 -4.881330 -7.987619
[13] -4.475865 -6.410490 -17.680645 -8.948901 -31.297439 -31.674821
[19] -5.565697 -11.943435 -9.663029 -8.383385 -5.240275 -6.661805
[25] -15.886160 -5.865802 -9.310881 -7.572668 -24.292698 -7.356445
[31] -13.450466 -9.488087 -8.763676 -7.782825 -87.586858 -9.131222
[37] -10.175841 -10.509013 -9.835872 -11.158148 -13.744013 -19.702968
[43] -12.856183 -7.133302 -75.557026 -21.425116 -11.475373 -10.343221
[49] -20.102594 -21.029806 -10.836219 -11.632377 -82.659672 -20.235490
[55] -37.171587 -12.097586 -15.605646 -24.034010 -10.673316 -29.277798
[61] -20.500835 -16.165367 -6.902190 -12.705964 -15.182243 -17.407459
[67] -19.836336 -63.355209 -64.929415 -92.388061 -51.074698 -24.163398
[73] -12.403344 -16.025922 -84.222650 -21.950431 -19.167825 -40.021951
[79] -27.117199 -17.270506 -65.171492 -48.507264 -14.898089 -15.323743
[85] -13.889967 -16.995849 -18.359679