我在写一个非常简单的R函数时遇到了一个问题。该函数的目的是更改data.frame中的单元格值。
f1=function(rn){
df[rn,2]="b"
}
输入代码后:
F1(1)
DF
df表看起来仍然相同,没有更改单元格(1,2)。任何人都可以向我解释为什么会这样?
谢谢!
答案 0 :(得分:2)
这不起作用的原因是因为该功能的范围不包括df。虽然你可以在全球环境中访问df,但它并不能影响全局环境(R试图成为一种功能语言的副作用之一
快速解决此问题的方法是使用访问全局环境的<<-
运算符。将您的功能更改为:
function(i) df[i,2] <<- 'b'
编辑:(不能评论不够的代表)对原始问题的评论提供了一个有效的解决方案,但由于您传递的是data.frames而不是修改它们,因此内存和时间效率很低。
以下是一些基准测试(我猜它是最小的,但是很好的做法)
单位:微秒
expr min lq mean median uq max neval
df1 <- f(3) 40.742 42.987 51.85747 43.950 61.9140 148.209 1000
g(3) 37.213 40.421 49.80885 41.704 64.6405 127.998 1000
EDIT2:
insertRow=function(rn){ if (T1$TRANS[rn]=="STOP") { T2[2,]<-T1[(rn),] return(T2)} return(0) }
可以改为
insertRow <- function(rn){ if (T1$TRANS[rn]=="STOP") { T2[2,]<<-T1[(rn),]}}