用于部分返回基于全局变量的数据集的函数

时间:2018-09-16 16:10:37

标签: r for-loop if-statement

我想创建一个执行以下操作的函数: 接收数据集 检查全局变量x是否为0或1 如果x为0,则应将x设为1,然后返回不包含第一行的数据集 如果x为1,则它应该离开x并返回每一行。

数据集是

mid counts 1 -2.25 3 2 -1.75 6 3 -1.25 14 4 -0.75 14 5 -0.25 17 6 0.25 19 7 0.75 12 8 1.25 9 9 1.75 4 10 2.25 2 11 2.25 -3 12 2.75 -6 13 3.25 -14 14 3.75 -14 15 4.25 -17 16 4.75 -19 17 5.25 -12 18 5.75 -9 19 6.25 -4 20 6.75 -2

我现在拥有的功能

testfunc = function(set){ print(x) for(i in 1:nrow(set)){ ifelse(x == 0, x <<- 1, return(set[i])) } }

这将打印出x,并且只显示数据集的counts行,而不会遗漏第一行。

1 个答案:

答案 0 :(得分:1)

您的函数逻辑有点错误。

首先,您完全不需要for循环

第二,您不需要ifelse来仅测试一个值。 length(x) == 1,因此您将测试x的一个值,并且应该使用简单的if完成。

看看这个ifelse在做什么:

ifelse(x == 0, x <<- 1, return(set[i]))

这将读取“如果x为零,则在x中将GlobalEnv设置为1,否则返回set[i]。显然这不是您想要的。

以下是正确的方法。

testfunc <- function(set){
  print(x)
  if(x == 0){
    x <<- 1
    return(set[-1, ])
  }else{
    return(set)
  }
}

现在先测试x == 0

x <- 0
res <- testfunc(dat)
x
#[1] 1

head(res)
#    mid counts
#2 -1.75      6
#3 -1.25     14
#4 -0.75     14
#5 -0.25     17
#6  0.25     19
#7  0.75     12

全局环境中x的值已更改,并且返回的数据帧没有第一行。

现在x == 1

res <- testfunc(dat)
x
#[1] 1

head(res)
#    mid counts
#1 -2.25      3
#2 -1.75      6
#3 -1.25     14
#4 -0.75     14
#5 -0.25     17
#6  0.25     19

x的值没有改变,返回的df是原始值。