R语言 创建一个函数来求向量的长度,而不使用length()

ijxebb2r  于 2023-01-28  发布在  其他
关注(0)|答案(4)|浏览(211)

我已经试过max(seq_along(x))了,但是如果我们输入numeric(0),我需要它也返回0。
所以是的,它适用于数字(0)以外的任何东西。这是我目前所拥有的:

my_length <- function(x){
  max(seq_along(x))
}
vs91vp4v

vs91vp4v1#

使用 * forloop *:

my_length <- function(x){
  l = 0
  for(i in x) l <- l + 1  
  return(l)
}

x <- numeric(0)
my_length(x)
# [1] 0

x <- 1:10
my_length(x)
# [1] 10

另一种选择:

my_length <- function(x) nrow(matrix(x))
2j4z5cfb

2j4z5cfb2#

您可以尝试在max()调用中包含一个0

my_length <- function(x) max(0, seq_along(x))

my_length(10:1)
[1] 10
my_length(NULL)
[1] 0
my_length(numeric())
[1] 0
zf9nrax1

zf9nrax13#

您可以使用NROW()。请参阅文档:
nrow和ncol返回x中存在的行数或列数。NCOL和NROW将向量视为1列矩阵,甚至是0长度的向量...

len <- \(x) NROW(x)

示例:

len(numeric(0))
#> [1] 0

len(letters)
#> [1] 26

len(c(3, 0, 9, 1))
#> [1] 4
9nvpjoqh

9nvpjoqh4#

下面是更多的functional programming方法:
1.使用Map求和

length = function (x) {
    sum(vapply(x, \(.) 1L, integer(1L)))
}

1.使用减少

length = function (x) {
    Reduce(\(x, .) x + 1L, x, 0L)
}

1.使用递归

length = function (x, len = 0L) {
    if (is_empty(x)) len else Recall(x[-1L], len + 1L)
}

遗憾的是,最后一个需要定义helper函数,不幸的是,如果不使用length(),这就不是微不足道的了:

is_empty = function (x) {
    is.null(x) || identical(x, vector(typeof(x), 0L))
}

相关问题