R中的For循环vs if/else

R中的For循环vs if/else,r,loops,R,Loops,我很难理解为什么这两段代码会产生截然不同的结果: 首先是一些功能: n <- 5000 alpha1 <- rep(NA, n) Y <- c(replicate(n, sample(c(-1, 1), 1, prob=c(1/2, 1/2)))) conditional_sampler <- function(x){ sample(c(-1, 1), 1, prob = c(x, 1-x)) } t <- .4 lower &l

我很难理解为什么这两段代码会产生截然不同的结果:

首先是一些功能:

n <- 5000
alpha1 <- rep(NA, n)
Y <- c(replicate(n, sample(c(-1, 1), 1, prob=c(1/2, 1/2))))

conditional_sampler <- function(x){      
    sample(c(-1, 1), 1, prob = c(x, 1-x))
  }

 t <- .4

  lower <- function(t){
    runif(1,(.4-t),.4)
  }

  upper <- function(t){
    runif(1,.6,(.6+t))
  }

n已编辑。n可以是任何数字。是的,它已初始化。在ifelse的情况下,我似乎总是得到0、5000或2470 alpha1==1,这是奇数。区别主要在于(1)性能和(2)随机种子。为什么
runif(1)
runif(1)
不同?尝试
set.seed(1)
,然后尝试
ifelse
代码,保存其值,然后再次执行
set.seed(1)
并对
代码执行
,然后比较向量。如果不同,你需要更具体地说明它们是如何“完全不同”的。我不确定是不是这么简单。当我运行for循环时,alpha1中的1s数会有所不同,但会徘徊在我预期的范围内。在ifelse中,它在0、5000和2470之间跳跃,这是荒谬的。我怀疑有更深层次的问题我不明白。我更喜欢使用ifelse来显著减少运行时间,但是for循环提供了适当的结果。哦,对了。。。这是因为
ifelse
的“then”和“else”参数各自返回一个数字(因为它们的输入
t
,长度为1)。由于
Y
是一个向量,因此将单个数字返回值复制
length(Y)
次以填充返回的向量。
alpha1 <- ifelse(Y==1, conditional_sampler(lower(t)), conditional_sampler(upper(t)))
 for (i in 1:n){
    if (Y[i]==1) {
      alpha1[i] <- conditional_sampler(lower(t))}
    else {
      alpha1[i] <- conditional_sampler(upper(t))}}