gpt4 book ai didi

r - 为什么子集不介意缺少数据帧的子集参数?

转载 作者:行者123 更新时间:2023-12-01 23:04:43 24 4
gpt4 key购买 nike

通常我想知道神秘的错误来自哪里,但现在我的问题是神秘的缺乏错误来自哪里。


numbers <- c(1, 2, 3)
frame <- as.data.frame(numbers)

如果我输入
subset(numbers, )

(所以我想取一些子集但忘记指定子集函数的子集参数)然后 R 提醒我(应该如此):

Error in subset.default(numbers, ) :
argument "subset" is missing, with no default



但是,当我键入
subset(frame,)

(所以与 data.frame 而不是向量相同),它不会给出错误,而是只返回(完整)数据帧。

这里发生了什么?为什么我没有收到当之无愧的错误信息?

最佳答案

tl;博士 : subset函数调用不同的函数(具有不同的方法),具体取决于它所馈送的对象的类型。在上面的示例中,subset(numbers, )使用 subset.defaultsubset(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

这表明如果对象有一个 data.frame 类,那么 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))

产生一个与 data.frame 长度相同的 TRUES 向量,最后一行
    x[r, vars, drop = drop]

将此向量输入到 row 参数中,这意味着如果您没有包含子集参数,那么 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com