通过R中的嵌套函数更新数据帧

通过R中的嵌套函数更新数据帧,r,R,我有一个小的可复制版本的问题,我与我的程序 我的代码结构包含嵌套函数,与下面所示的函数类似,只是更复杂 x <- data.frame(c(1:5),c(0)) colnames(x) <- c("val1", "val2") foo <- function() { for(i in 1:length(x[,1])) { bar(i) } print(x) } bar <- function(i) { if(x[i,2] == 0) {

我有一个小的可复制版本的问题,我与我的程序

我的代码结构包含嵌套函数,与下面所示的函数类似,只是更复杂

x <- data.frame(c(1:5),c(0))
colnames(x) <- c("val1", "val2")

foo <- function() {
  for(i in 1:length(x[,1])) {
    bar(i)
  }
  print(x)
}

bar <- function(i) {
   if(x[i,2] == 0) {
    x[i,2] <- 1
    print(x[i,])
  }
  return(x)
}

>foo()
  val1 val2
1    1    1
  val1 val2
2    2    1
  val1 val2
3    3    1
  val1 val2
4    4    1
  val1 val2
5    5    1
  val1 val2
1    1    0
2    2    0
3    3    0
4    4    0
5    5    0

x最好将
data.frame
作为参数传递,而不是硬编码到函数中。这里有一些修改,应该可以完成你想要的

foo <- function(df) {
  for(i in seq_len(nrow(df))) {
    df[i, ] <- bar(df[i, ])
  }
  print(df)
}

bar <- function(df) {
  if(df[, "val2"] == 0) {
    df[, "val2"] <- 1
    print(df[, ])
  }
  return(df)
}

> foo(x)
  val1 val2
1    1    1
  val1 val2
2    2    1
  val1 val2
3    3    1
  val1 val2
4    4    1
  val1 val2
5    5    1
  val1 val2
1    1    1
2    2    1
3    3    1
4    4    1
5    5    1

foo所以我有点困惑,为什么需要编写函数来实现这一点。到目前为止,最简单的解决方案只是有条件地对数据帧进行子集划分并分配值:

  x <- data.frame(c(1:5),c(0))
  colnames(x) <- c("val1", "val2")


  x$val2[x$val2==0]<-1

x您能简单地解释一下您希望从函数中得到什么输出吗?我想我有一个答案,但我不太确定我是否知道您想要什么解决方案。感谢您的回复,我正在寻找更新的数据帧x,其中第2列上的所有值都将为1。在更复杂的示例中,我希望您希望有条件地更改第2列?非常好,谢谢。这正是我想要的,我对自己找不到解决办法感到失望。我说,
df[I,]行是正确的,对吗。在函数
栏中修改了原始函数
x
,但没有对调用环境
foo
进行更改。以下是一些好信息: