我已经试过max(seq_along(x))了,但是如果我们输入numeric(0),我需要它也返回0。所以是的,它适用于数字(0)以外的任何东西。这是我目前所拥有的:
max(seq_along(x))
numeric(0)
my_length <- function(x){ max(seq_along(x)) }
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))
2j4z5cfb2#
您可以尝试在max()调用中包含一个0:
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
zf9nrax13#
您可以使用NROW()。请参阅文档:nrow和ncol返回x中存在的行数或列数。NCOL和NROW将向量视为1列矩阵,甚至是0长度的向量...
NROW()
len <- \(x) NROW(x)
示例:
len(numeric(0)) #> [1] 0 len(letters) #> [1] 26 len(c(3, 0, 9, 1)) #> [1] 4
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(),这就不是微不足道的了:
length()
is_empty = function (x) { is.null(x) || identical(x, vector(typeof(x), 0L)) }
4条答案
按热度按时间vs91vp4v1#
使用 * forloop *:
另一种选择:
2j4z5cfb2#
您可以尝试在
max()
调用中包含一个0
:zf9nrax13#
您可以使用
NROW()
。请参阅文档:nrow和ncol返回x中存在的行数或列数。NCOL和NROW将向量视为1列矩阵,甚至是0长度的向量...
示例:
9nvpjoqh4#
下面是更多的functional programming方法:
1.使用Map和求和:
1.使用减少:
1.使用递归:
遗憾的是,最后一个需要定义helper函数,不幸的是,如果不使用
length()
,这就不是微不足道的了: