尝试实现早期帖子的解决方案,并遇到了使用函数我不理解的行为。
我有一个表格的数据集:
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
有人可以解释为什么这是我做错了吗?
答案 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.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
答案 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)