发现如果习惯了一个编程语言,想当然的往另一个上套,是要吃大亏的,这是一个真实的经历。我最早学的Python,习惯了它的英语化编程,到了最近操作表的多了起来,发现R语言更顺手些,就转向了R语言,一直用得还不错,属于不求效率,只求能解决问题的主,不过,今天发现的程序bug,令我汗颜了一波。详细如下:
R中的实现
先来看R语言的代码,一个for循环,两三行,如此简单,就出了个大毛病:
代码语言:javascript复制 for (i in 1:length(rownames(T_P))) {
T_P$Median[i] <- mean(as.numeric(T_P[i,]))
}
# 数据在这里:
AL DH RN
En3 1.87694501 1.58559653 1.32844769
En8 1.76545633 1.49141366 1.24953920
En9 1.09405837 0.92423334 0.77434304
各位能发现问题出在哪吗?就出在这个赋值操作上,重要的问题说3遍,R语言是向量化的,R语言是向量化的,R语言是向量化的。这个循环中第一个赋值就把一列给赋值了,所以计算就不会正确了,除了第一个结果。看看错误的结果:
代码语言:javascript复制# 运行第一个时的结果
AL DH RN Median
En3 1.87694501 1.58559653 1.32844769 1.59699641
En8 1.76545633 1.49141366 1.24953920 1.59699641
En9 1.09405837 0.92423334 0.77434304 1.59699641
# 运行完成后
AL DH RN
En3 1.87694501 1.58559653 1.32844769 1.59699641
En8 1.76545633 1.49141366 1.24953920 1.52585140
En9 1.09405837 0.92423334 0.77434304 1.09740779
正确操作
当然我这代码不是最优的,解决问题是第一要务,优化第二,很多时候优化就省略了,如果没有速度上需求,特别是数据量比较小的情况。
代码语言:javascript复制 Median <- c()
for (i in 1:length(rownames(T_P))) {
Median <- c(Median, mean(as.numeric(T_P[i,])))
}
T_P <- cbind(T_P, Median)