我想创建一个执行以下操作的函数: 接收数据集 检查全局变量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行,而不会遗漏第一行。
答案 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是原始值。