首页 > 解决方案 > 解决 R 函数中的 nrow/length(list) 错误

问题描述

我有一个功能:

extract_tmp <- function(x,y)
{
  nr <- nrow(x$y)
  ind <- seq(6, nr, by = 12)
  out <- lapply(Map(seq, ind[ seq_along(ind) %% 2 == 1 ], ind[ seq_along(ind) %% 2 == 0 ]),
                function(i) x$y[i])
}

当我打电话时:

extract_tmp(JAN , tmp.2007.jan)

它返回:

Error in seq.default(6, nr, by = 12) : 'to' must be of length 1

当我切换nrow()length()它时返回:

Error in seq.default(6, nr, by = 12) : wrong sign in 'by' argument 

我已经阅读此站点并进行了几个小时的故障排除,但无法解决这些问题。附加信息:

length(JAN$tmp.2007.jan)
# 744
nrow(JAN$tmp.2007.jan)
# NULL
mode(JAN)
# "list"
mode(JAN$tmp.2007.jan)
# "numeric"

谢谢你的帮助。

标签: rlistfunctionsyntax-errorlapply

解决方案


extract_tmp <- function(x, y) {
  nr <- nrow(x)
  ind <- seq(6, nr, by = 12)
  out <- lapply(Map(seq, ind[ seq_along(ind) %% 2 == 1 ], ind[ seq_along(ind) %% 2 == 0 ]),
                function(i) x[[y]][i])
  out
}
extract_tmp(mtcars, "cyl")
# [[1]]
#  [1] 6 8 4 4 6 6 8 8 8 8 8 8 4
# [[2]]
#  [1] 6 8 4 4 4 8 8 8 8 4 4 4 4

固定的东西:

  1. 一般来说,您不能传递未引用的列名。我建议您为第二个参数传递一个字符串并使用x[[y]]而不是x$y. (可以使用substitute和其他 NSE(非标准评估)方法,但是在 R 开始时,我建议您继续使用标准评估。

  2. nrow对帧而不是向量进行操作,所以nrow(x)or length(x[[y]])

  3. 本身不是问题,但它可能看起来是一个问题。你没有明确地out从你的函数中返回。在 R 中,通常在代码块中返回最后一个表达式。当最后一个表达式是赋值 ( <-) 时,它的值也被不可见地返回(这就是为什么a <- b <- 2有效:表达式b <- 2不可见地返回所分配的值,然后级联到a <- 2.

    在这种情况下,如果没有out像我上面那样添加显式,它仍然会返回您需要的结果,但它似乎什么也不做:extract_tmp(mtcars, "cyl")似乎什么也不返回,但是如果您将结果分配给一个变量并查看它,或者如果您(extract_tmp(mtcars, "cyl"))改为调用(围绕括号),那么您将看到输出。

    一般来说,我强烈建议您明确说明您的返回变量。一个原因是声明性代码。另一个原因是有时最后一个表达式不适用于所有需要的值。例如,考虑这个块:

    x <- 1:10
    x[3] <- 99
    

    在这种情况下,最后一个赋值的值为 99,而不是 的内容x,因此如果您打算将返回值作为整个向量,那么您将错过。


推荐阅读