R 为什么子集不';不介意丢失数据帧的子集参数吗?

R 为什么子集不';不介意丢失数据帧的子集参数吗?,r,dataframe,subset,R,Dataframe,Subset,通常我想知道神秘的错误从何而来,但现在我的问题是神秘的错误缺失从何而来 让 (所以我想取一些子集,但忘了指定子集函数的子集参数)然后R提醒我(应该是这样): 子集错误。默认值(数字:): 缺少参数“子集”,没有默认值 但是当我打字的时候 subset(frame,) (与使用data.frame而不是向量时一样),它不会给出错误,而是返回(完整的)数据帧 这是怎么回事?为什么我没有收到我应得的错误消息?tl;dr:根据输入对象的类型,子集函数调用不同的函数(具有不同的方法)。在上面的示例中,s

通常我想知道神秘的错误从何而来,但现在我的问题是神秘的错误缺失从何而来

(所以我想取一些子集,但忘了指定子集函数的子集参数)然后R提醒我(应该是这样):

子集错误。默认值(数字:):
缺少参数“子集”,没有默认值

但是当我打字的时候

subset(frame,)
(与使用
data.frame
而不是向量时一样),它不会给出错误,而是返回(完整的)数据帧


这是怎么回事?为什么我没有收到我应得的错误消息?

tl;dr:根据输入对象的类型,
子集
函数调用不同的函数(具有不同的方法)。在上面的示例中,
subset(number,)
使用
subset.default
,而
subset(frame,)
使用
subset.data.frame


R内置了两个面向对象的系统。最简单也是最常见的是S3。这种OO编程风格实现了Wickham所称的“通用函数OO”。在这种OO风格下,称为通用函数的对象查看对象的类,然后对对象应用适当的方法。如果不存在直接方法,则始终存在可用的默认方法

为了更好地了解S3如何工作以及其他OO系统如何工作,您可以查看站点的相关部分。为对象找到合适方法的过程称为方法分派。您可以在帮助文件
?UseMethod
中阅读有关此的更多信息

子集
的详细信息部分所述,
子集
函数“是一个通用函数”。这意味着
子集
在第一个参数中检查对象的类,然后使用方法分派将适当的方法应用于对象

泛型函数的方法编码为

可以使用
方法()
找到。对于
子集
,我们得到

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]
}
将此向量输入行参数,这意味着如果未包含子集参数,则
subset
函数将返回data.frame的所有行

方法
调用的输出中可以看出,
子集
没有用于原子向量的方法。这意味着,作为你的错误

子集中出错。默认值(数字,)

当您将
subset
应用于向量时,R调用
subset.default
方法,该方法定义为

subset.default
function (x, subset, ...) 
{
    if (!is.logical(subset)) 
        stop("'subset' must be logical")
    x[subset & !is.na(subset)]
}
当缺少subset参数时,
subset.default
函数将抛出一个错误,错误为
stop

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.default
function (x, subset, ...) 
{
    if (!is.logical(subset)) 
        stop("'subset' must be logical")
    x[subset & !is.na(subset)]
}