-2

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

我有一个形式的数据集:

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

4 回答 4

3

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

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
于 2013-09-10T14:37:34.617 回答
2

您可以使用eval.parent和的组合bquote

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
于 2013-09-10T14:51:47.757 回答
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 在他的回答中的解决方案相同。

于 2013-09-10T14:35:22.450 回答
0

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

于 2013-09-10T14:37:21.527 回答