这些数据帧赋值之间的区别是什么?



我有一个数据帧,看起来像这样:

 pid tid      pname 
 2   NA       proc/boot/procnto-smp-instr

现在,如果我这样做,我希望什么也不会发生:

y[c(FALSE), "pid"] <- 10

没有变化(y没有变化)。但是,如果我这样做:

y[c(FALSE),]$pid <- 10

:

$<-.data.frame (*tmp*, "pid", value = 10)错误:
更换有1行,数据有0

所以我的问题是,[, "col"]<-$col<-有什么区别?为什么要抛出异常?额外的好处是:在文档中我可以读到更多关于这个的信息?

该错误来自$<-.data.frame的代码,该代码检查原始data.frame是否至少与替换向量的长度一样多行:

 nrows <- .row_names_info(x, 2L)
    if (!is.null(value)) {
        N <- NROW(value)
        if (N > nrows) 
            stop(sprintf(ngettext(N, "replacement has %d row, data has %d", 
                "replacement has %d rows, data has %d"), N, nrows), 
                domain = NA)

[<-是一个不同的函数,它不执行此检查。它是一个primitive函数,您可以在R内部手册

中了解更多信息。

这一次,这些操作是由两个非常不同的函数执行的:y[FALSE, 'pid'] <- 10是对[<-.data.frame函数的调用,而y[FALSE, ]$pid <- 10是对$<-.data.frame函数的调用,错误消息给了您这个线索。你可以通过输入他们的名字(就像上面一样,加上反引号)来了解他们的不同之处。然而,在这种特殊情况下,他们打算以同样的方式行事。他们通常会这样做。试试y[1, 'pid'] <- 1:3 vs y[1, ]$pid <- 1:3。您的情况是"特殊的",因为y[FALSE, ]返回给您一个"奇怪"的对象-一个0行和三列的data.frame。IMHO,抛出异常是一种正确的行为,这是[<-.data.frame函数中的一个小错误,但是语言开发人员对这个主题的看法更重要。如果您想自己看看区别在哪里,输入debug([<-.data.frame)并运行您的示例。你的"奖励"问题的答案是输入?[<-.data.frame并阅读,尽管它非常非常干燥:(最好的。

p。格式化去掉反引号,因此,例如,[<-.data.frame意味着。对不起。

相关内容

最新更新