【问题标题】:Dataframe does not remember change made by a function数据框不记得函数所做的更改
【发布时间】:2013-09-10 14:31:13
【问题描述】:

尝试实现较早帖子的解决方案,但遇到了我不理解使用函数的行为。

我有一个表格的数据集:

tC <- textConnection("Col1  Col2    Col3
yes no  no
yes no  yes
yes yes yes");
data1 <- read.table(header=TRUE, tC);
close.connection(tC);
rm(tC);
data1["Col4"] <- NA;

现在我想使用一个函数(暂时)任意替换第 4 列中的条目:

updateRow <- function(rIndex) {  
    data1[rIndex, 4] <- 1
data1 <- return(data1)
}

但是,当我应用该函数时,它似乎按预期更新(第 1 行 col4 的条目变为“1”),但是当我调用它时数据框恢复到其原始内容:

updateRow(4)
data1

有人可以解释这是为什么以及我做错了什么吗?

【问题讨论】:

  • 我注意到您没有接受您提出的最后两个问题的答案。请注意,如果您想继续在此站点上获得帮助,请接受能够为您提供满足您需求的最佳解决方案的答案。您可以通过点击投票下方的复选框来接受答案。
  • 谢谢。我不知道这一点,但已经这样做了。

标签: r


【解决方案1】:

您的代码中有很多语法错误。我想你实际上是想打电话给updateRow(1)。这是另一个不需要您重新定义数据框的解决方案。您的问题来自不了解 R 环境。这个post 帮助了我很多。

updateRow <- function(rIndex) {  
  data1[rIndex, 4] <<- 1
}

> data1
  Col1 Col2 Col3 Col4
1  yes   no   no   NA
2  yes   no  yes   NA
3  yes  yes  yes   NA

> updateRow(1)
> data1
  Col1 Col2 Col3 Col4
1  yes   no   no    1
2  yes   no  yes   NA
3  yes  yes  yes   NA

> updateRow(4)
> data1
  Col1 Col2 Col3 Col4
1  yes   no   no    1
2  yes   no  yes   NA
3  yes  yes  yes   NA
4 <NA> <NA> <NA>    1

【讨论】:

    【解决方案2】:

    您可以使用eval.parentbquote 的组合:

    updateRow <- function(rIndex) eval.parent(bquote(data1[.(rIndex), 4] <- 1))
    

    结果:

    > updateRow(4)
    > data1
      Col1 Col2 Col3 V4
    1  yes   no   no NA
    2  yes   no  yes NA
    3  yes  yes  yes NA
    4 <NA> <NA> <NA>  1
    

    【讨论】:

    【解决方案3】:

    如果您的目的是更新 data1,则您的语法是错误的。你应该使用

    updateRow <- function(rIndex) {  
        data1[rIndex, 4] <- 1
        return(data1)
    }
    data1<-updateRow(4)
    

    应该这样做。它将更新第 4 行和第 4 列并将值设置为 1。

    如果你想跳过最后一个赋值,你可以将函数定义为

    updateRow <- function(rIndex) {  
        data1[rIndex, 4] <<- 1
    }
    updateRow(4)
    

    这也会将第 4 行和第 4 列更新为值 1。这与 dayne 在他的答案中的解决方案相同。

    【讨论】:

    • @dayne 我之前没有看到你的答案。我只是迭代地改进了我自己的答案。如果你觉得被侵犯了,我当然可以删除它。我已将您的名字添加到我的答案中。
    • 谢谢,这很好用。还有我之前没见过的“
    • @marcel - 引用fortune(174) “我希望&lt;&lt;- 从未被发明过,因为它使语言的一个深奥而危险的特征似乎正常且合理。如果您想将 R/S 简化为宏语言,这就是您的运算符”。 - 比尔·维纳布尔斯(2001 年)。这不是 R 世界中经常推广的功能。
    • 对此我必须同意@thelatemail。 &lt;&lt;- 操作符使用起来很危险,因为它在没有明确知识的实体上操作。
    【解决方案4】:

    您没有为 dataRow 分配任何内容,因此 updateRow 中的 data1 不会“导出”到函数之外,即,您从未真正更新 data1。你应该说data1 &lt;- updateRow(4)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多