R 函数使用 'for' 循环,该循环返回一个列表,其中包含字符串中的大写、小写和数值数



我正在学习如何编写一个函数'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

最新更新