r - 解决 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"
谢谢你的帮助。
解决方案
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
对帧而不是向量进行操作,所以nrow(x)
orlength(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
,因此如果您打算将返回值作为整个向量,那么您将错过。
推荐阅读
- javascript - IF条件下的函数调用
- javascript - 如何组织同步和异步的相似代码
- wpf - WPF ObservableCollection 与 MVVM 中的 Datagrid 绑定
- download - 如何使用 jira rest api 使 jira 附件下载工作
- php - 如何将一个数组中的键匹配到另一个数组,并从另一个返回键
- xcode - 在 pubspec.yaml 中添加资产时,Xcode Simulator 无法在 Flutter 中运行
- django - 如何将芹菜设置为守护进程
- java - 如何访问 JSON 元素?
- qt - 使用 Golang 生成 QByteArray 格式
- node.js - 如何在 Jade 中设置等于它的表单值之前检查变量是否存在:模板引擎