【发布时间】:2017-01-03 16:07:21
【问题描述】:
我编写了以下循环来将用户输入(可以是一位、两位或三位数字)转换为所有三位数字;这样输入向量 [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],该函数看起来有效,然后以下数字存在错误,但对于 id[41:50],我再次得到正确的输出。我一直无法弄清楚为什么会这样,以及我做错了什么。任何建议都受到热烈欢迎。
【问题讨论】:
-
只要使用
sprintf("%03i",id) -
感谢您的回答,我也这样做了,它有效。我仍然想知道为什么 R 对上面的代码有问题..
-
或者如果由于某种原因您不想使用
sprintf并且更喜欢paste结果一起使用然后paste0(strrep("0", 3-nchar(id)), id) -
另请注意,这确实有效:
unlist(zeroes(as.list(id)))因为列表的每个组件都可以有不同的类,因此转换为字符不会影响其他组件。这也可以:sapply(id, zeroes)和Vectorize(zeroes)(id)一样。
标签: r loops vector user-input