我有一个功能:

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"

谢谢你的帮助。

最佳答案

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

修复的问题:
  • 在一般意义上,您不能传递未引用的列名。我建议您为第二个参数传递一个字符串,并使用x[[y]]而不是x$y。 (可以使用substitute和其他NSE(非标准评估)方法,但是从R开始时,我建议您继续使用标准评估。
  • nrow对帧(而不是 vector )进行操作,因此nrow(x)length(x[[y]])起作用。
  • 本身不是问题,但似乎是一个问题。您没有从函数中显式返回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的内容,因此,如果您打算将返回值作为整个 vector ,则可能会漏掉。
  • 08-27 00:25