我编写了以下循环,将用户输入转换为所有三位数字,可以是单数字,两位或三位数字;这样输入矢量[7,8,9,10,11]将被转换成输出矢量[007,008,009,010,011]。这是我的代码:
zeroes <- function(id){
for(i in 1:length(id)){
if(id[i] <= 9){
id[i] <- paste("00", id[i], sep = "")
}
else if(id[i] >= 10 && id[i] <= 99){
id[i] <- paste("0", id[i], sep = "")
}
}
id
}
对于输入向量
id <- 50:100
我得到以下输出:
[1] "050" "0051" "0052" "0053" "0054" "0055" "0056" "0057" "0058" "0059"
[11] "0060" "0061" "0062" "0063" "0064" "0065" "0066" "0067" "0068" "0069"
[21] "0070" "0071" "0072" "0073" "0074" "0075" "0076" "0077" "0078" "0079"
[31] "0080" "0081" "0082" "0083" "0084" "0085" "0086" "0087" "0088" "0089"
[41] "090" "091" "092" "093" "094" "095" "096" "097" "098" "099"
[51] "00100"
所以,对于id [1]看起来这个函数是有效的,那么下面的数字就有一个bug,但是对于id [41:50],我又得到了正确的输出。我还没有弄清楚为什么会这样,我做错了什么。任何建议都受到热烈欢迎。
答案 0 :(得分:6)
因为当你在函数中对id
进行第一次替换时,向量变为字符(因为向量不能存储数字和字符)。
所以zeroes(51)
工作正常:
> zeroes(51)
[1] "051"
但如果是第二项,则失败:
> zeroes(c(50,51))
[1] "050" "0051"
因为当你的循环进入51时,其实际上是“51”的引号。那就失败了:
> zeroes("51")
[1] "0051"
因为“51”小于9:
> "51"<9
[1] TRUE
因为R将9转换为“9”然后进行字符比较,所以在整理顺序字母表中只有“5”与“9”进行比较而“5”在“9”之前。
其他语言可能会将字符“51”转换为数字,然后与数字9进行比较,并说“51”&lt; 9为False,但R会这样做。
课程:不要覆盖输入向量! (并使用sprintf
)。