Dataframe不记得函数所做的更改

时间:2013-09-10 14:31:13

标签: r

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

我有一个表格的数据集:

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

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

4 个答案:

答案 0 :(得分:3)

您的代码中存在大量语法错误。我认为你的意思是打电话给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

答案 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

答案 2 :(得分:1)

如果您的目的是更新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在答案中的解决方案相同。

答案 3 :(得分:0)

您没有为dataRow分配任何内容,因此updateRow中的data1不会从函数中“导出”,即您实际上从未实际更新data1。你应该说data1 <- updateRow(4)