创建一个函数/forloop,将每个x与所有y';s

创建一个函数/forloop,将每个x与所有y';s,r,function,R,Function,我有一个函数,它告诉我数字a是否等于或接近于数字b,其中1=是,0=否: f <- function(a,b){ if(((b<0)&(a>= b)&(a<=-b))|((b>0)&(a<= b)&(a>=-b))) { print(1) } else { print(0) } 我很难弄清楚如何更改函数或创建forloop,这样它就不会逐行计算,相反,对于每个a,它会为b的所有值吐出1或0

我有一个函数,它告诉我数字a是否等于或接近于数字b,其中1=是,0=否:

f <- function(a,b){

  if(((b<0)&(a>= b)&(a<=-b))|((b>0)&(a<= b)&(a>=-b)))
  {
    print(1)
  }
 else
 {
  print(0)
 }
我很难弄清楚如何更改函数或创建forloop,这样它就不会逐行计算,相反,对于每个a,它会为b的所有值吐出1或0。在那之后,我可以很容易地把1加在一起,然后除以观察的总数,得到每个a的概率


如果您有任何建议,我们将不胜感激。

我想您需要将输入和输出矢量化的
ifelse

f <- function(a, b) ifelse(((b < 0)&(a >= b)&(a <= -b))|((b > 0)&(a <= b)&(a >= -b)), 1, 0)

f(rnorm(10), rnorm(10))
#> [1] 1 0 0 1 0 0 1 0 0 1
f=b)和(a0)和(a=-b)),1,0)
f(形式(10),形式(10))
#> [1] 1 0 0 1 0 0 1 0 0 1
尽管@MauritsEvers指出,仅进行逻辑测试本身并强制使用数字向量是另一种选择:

f <- function(a, b) 1 * (((b < 0) & (a >= b) & (a <= -b)) | ((b > 0) & (a <= b) & (a >= -b)))
f=b)和(a0)和(a=-b)))

此处不需要
ifelse
;您可以使用
as.integer
或(使用一元
+
)将布尔表达式转换为
整数。示例:将
ifelse(mtcars$cyl>5,0,1)
+(!mtcars$cyl>5)
进行比较。在其他(不好的)事情中,
ifelse
很慢,所以如果可以的话,通常最好避免它。对于数字
a
和向量
b
f=function(a,b)mean(a
将给出
b
的分数,其中
a
更接近于零。
f <- function(a, b) 1 * (((b < 0) & (a >= b) & (a <= -b)) | ((b > 0) & (a <= b) & (a >= -b)))