【问题标题】:Function to return data set partly based on global variable部分基于全局变量返回数据集的函数
【发布时间】:2023-03-12 06:59:01
【问题描述】:

我想创建一个执行以下操作的函数: 接受一个数据集 检查全局变量 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 的打印结果,并且只给出了数据集的计数行,而第一行没有遗漏。

【问题讨论】:

  • 我不确定我是否理解,x 不依赖于i,因此不需要循环,如果x == 0i == 1 将始终返回。在这种情况下,返回值将是set[-1, ]
  • 基本上我需要知道为什么ifelse(x == 0, x &lt;&lt;- 1, return(set[i])) 没有在x == 0 时删除第一行而是给出整个集合以及为什么返回只是集合的第二列。
  • 查看答案。
  • @RuiBarradas 谢谢

标签: r for-loop if-statement


【解决方案1】:

你的函数逻辑有点错误。

首先,您根本不需要for 循环

其次,您不需要ifelse 来测试一个值。 length(x) == 1 所以你将测试x 的一个值,这应该用一个普通的if 来完成。

看看这个ifelse在做什么:

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

这读作“如果x 为零,则在GlobalEnv 中将x 设置为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的值发生了变化,返回的dataframe没有第一行。

现在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是原来的。

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多