【问题标题】:Resolving nrow/length(list) error in R function解决 R 函数中的 nrow/length(list) 错误
【发布时间】:2020-06-17 21:53:15
【问题描述】:

我有一个函数:

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"

感谢您的帮助。

【问题讨论】:

  • nrow 是一帧的行数,对向量没有意义。如果x 是一个框架并且f 是其中的一个列,那么nrow(x) == length(x$f)。使用其中一种。

标签: r list function syntax-error lapply


【解决方案1】:
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)length(x[[y]])

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

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

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

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

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

【讨论】:

  • 哦,又是你!谢谢!我让它与你的建议一起工作。按照这个速度,我将不得不在我的论文中感谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多