3

我有一个看起来像这样的数据框:

 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<-?为什么会抛出异常?还有额外的好处:我可以在文档中的哪里阅读更多相关信息?

4

2 回答 2

2

错误来自$<-.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 Internals 手册中了解更多信息

于 2013-06-06T20:38:23.133 回答
1

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

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

于 2013-06-06T22:10:22.053 回答