我有一个功能:
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 ,则可能会漏掉。