- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常我想知道神秘的错误来自哪里,但现在我的问题是神秘的缺乏错误来自哪里。
让
numbers <- c(1, 2, 3)
frame <- as.data.frame(numbers)
subset(numbers, )
Error in subset.default(numbers, ) :
argument "subset" is missing, with no default
subset(frame,)
data.frame
而不是向量相同),它不会给出错误,而是只返回(完整)数据帧。
最佳答案
tl;博士 : subset
函数调用不同的函数(具有不同的方法),具体取决于它所馈送的对象的类型。在上面的示例中,subset(numbers, )
使用 subset.default
而subset(frame, )
使用 subset.data.frame
.
R 内置了几个面向对象的系统。最简单和最常见的称为 S3。这种 OO 编程风格实现了 Wickham 所说的“通用函数 OO”。在这种 OO 风格下,称为泛型函数的对象查看对象的类,然后将适当的方法应用于对象。如果不存在直接方法,则始终有可用的默认方法。
为了更好地了解 S3 和其他 OO 系统的工作原理,您可以查看 Advanced R 的相关部分。地点。为对象找到正确方法的过程称为方法分派(dispatch)。您可以在帮助文件 ?UseMethod
中了解更多信息。 .
如 ?subset
的详细信息部分所述, subset
函数“是一个通用函数”。这意味着 subset
检查第一个参数中对象的类,然后使用方法分派(dispatch)将适当的方法应用于对象。
泛型函数的方法编码为
< generic function name >.< class name >
methods(<generic function name>)
找到.对于
subset
,我们得到
methods(subset)
[1] subset.data.frame subset.default subset.matrix
see '?methods' for accessing help and source code
subset
调用
subset.data.frame
方法(功能)。定义如下:
subset.data.frame
function (x, subset, select, drop = FALSE, ...)
{
r <- if (missing(subset))
rep_len(TRUE, nrow(x))
else {
e <- substitute(subset)
r <- eval(e, x, parent.frame())
if (!is.logical(r))
stop("'subset' must be logical")
r & !is.na(r)
}
vars <- if (missing(select))
TRUE
else {
nl <- as.list(seq_along(x))
names(nl) <- names(x)
eval(substitute(select), nl, parent.frame())
}
x[r, vars, drop = drop]
}
r <- if (missing(subset))
rep_len(TRUE, nrow(x))
x[r, vars, drop = drop]
subset
函数将返回 data.frame 的所有行。
methods
的输出中看到的那样调用,
subset
没有原子向量的方法。这意味着,作为你的错误
Error in subset.default(numbers, )
subset
对于一个向量,R 调用
subset.default
方法定义为
subset.default
function (x, subset, ...)
{
if (!is.logical(subset))
stop("'subset' must be logical")
x[subset & !is.na(subset)]
}
subset.default
函数抛出
stop
的错误当子集参数丢失时。
关于r - 为什么子集不介意缺少数据帧的子集参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39348562/
我是一名优秀的程序员,十分优秀!