我正在学习如何编写一个函数'f',该函数接受一个输入字符串's',并返回一个包含3个组件的命名列表(s
中的[0,9]位数,小写字母和大写字母(。
我的答案必须包括一个"for"循环,为了检查我的答案,str(f3("123abA"))
的输出是:
# List of 3
# $ num: num 3
# $ l : num 2
# $ L : num 1
我确实找到了一种方法,但没有包含"for"循环。我知道这对一些人来说可能微不足道,但我才刚刚开始,仍然需要使用R中的循环来发展技能:(
f3 <- function(s){
number <- str_count(s, "[0-9]")
lower <- str_count(s, "[a-z]")
upper <- str_count(s, "[A-Z]")
return(list(num = as.numeric(number), l = as.numeric(lower), L = as.numeric(upper)))
}
你有办法帮我吗?感谢
当存在已知的矢量化解决方案时,明确要求for
循环不是很像R,但它就是这样。
f4 <- function(s){
x <- unlist(strsplit(as.character(s), ""))
number <- 0L
lower <- 0L
upper <- 0L
not_valid <- 0L
for(y in x){
if("0" <= y & y <= "9"){
number <- number + 1L
} else if("A" <= y & y <= "Z"){
upper <- upper + 1L
} else if("a" <= y & y <= "z"){
lower <- lower + 1L
} else {
not_valid <- not_valid + 1L
}
}
if(not_valid){
msg <- paste("There are", not_valid, "invalid characters in input string.")
warning(msg)
}
list(
number = number,
lower = lower,
upper = upper
)
}
str(f4("123abA"))
#List of 3
# $ number: int 3
# $ lower : int 1
# $ upper : int 2
str(f4("123ab.A"))
#List of 3
# $ number: int 3
# $ lower : int 1
# $ upper : int 2
#Warning message:
#In f4("123ab.A") : There are 1 invalid characters in input string.
这是一个非常奇怪的任务,因为您当前的解决方案非常好且高效。
这将是一个效率较低的答案,但它确实有一个for循环:
f3 <- function(x){
y <- strsplit(x, "")[[1]]
vec_number <- c()
vec_lower <- c()
vec_upper <- c()
for(i in 1:length(y)){
vec_number[i] <- grepl("[0-9]", y[i])
vec_lower[i] <- grepl("[a-z]", y[i])
vec_upper[i] <- grepl("[A-Z]", y[i])
}
return(list(num = sum(vec_number), l = sum(vec_lower), L = sum(vec_upper)))
}
> str(f3("123abA"))
List of 3
$ num: int 3
$ l : int 2
$ L : int 1