R函数重复使用其输出作为自己的输入

时间:2017-12-17 17:22:38

标签: r function for-loop

给定R函数auto(下面),我想知道是否可能从for的{​​{1}}循环输出的第二次运行用作ps }?

例如,如果循环将要进行3次(即pr),那么在循环的第一次运行中length(n) = 3将按原样使用,但是从第二次运行开始,结果为从pr开始的ps(即ps(x))取代prlength(n)的数量。

因此,在for循环的第一次运行之后,每次,前一次运行的ps(x)都将pr的角色用于下一次运行。我的最终目标是curve以这种方式获得的最终ps

auto <- function(n, dat){

for(i in 1:length(n)){           
 pr = function(x) dbeta(x, 1, 1)
 lk = function(x) dbinom(dat[i], n[i], x) # So, here first `n = 100` and 
 ps = function(x) pr(x)*lk(x)             # `dat = 55` will go thru first 
  }                                       # round of the loop and produce
 curve(ps)                                # a `ps`. But in the second run of
}                                         # the loop, the `ps` just
# Example of use:                         # produced will be used as `pr`
auto(n = c(100, 50), dat = c(55, 60) )    # for `n = 50` and `dat = 60`
                                          # to produce a new `ps`.

3 个答案:

答案 0 :(得分:0)

让我试着回答。

所以,首先,我想,你需要有限状态自动机功能。此方法需要使用环境用法,您需要在其中存储函数调用的状态和值。 但是,您只需根据循环索引值进行选择。 它更容易,因为您只需switch运算符而已。

auto <- function(n, dat, n.loop){
x <- 0.1;
for(i in 1:n.loop){
val <- switch(i, dbeta(x, 1, 1), dbinom(dat, n, x), dbeta(x, 1, 1)*dbinom(dat, n, x))
print(val);
  }
}

auto(n = 100, dat = 55, n.loop = 3)

我有两个问题,应该很好地重新组织代码。 1)您在auto中使用的x值是多少?这不是代码中的参数,因此,您应该直接在x中确定auto的值。也许这是一个争论? 2)您的函数需要作为值返回什么值?

因此,添加了x <- 0.1print(val)来检查代码执行情况。

答案 1 :(得分:0)

我想用另一种方式。虽然,我还没有完成它,但仍然想与其他人分享改进的想法。我正在寻找解决它的非常基本和粗暴的方法。

auto <- function(n, dat){
  pr = function(x) dbeta(x, 1, 1)
  lk = function(x) dbinom(dat[1], n[1], x)
  ps = function(x) pr(x)*lk(x) 
  #keep the funtion till now in psold 
  psold = ps
  #loop through 2nd to 2nd last element
  for(i in 2:length(n)-1){
    lk = function(x) dbinom(dat[i], n[i], x)
    #Use psold to evaluate new function ps
    ps = function(x) psold(x)*lk(x)
    psold = ps
  }
  lk = function(x) dbinom(dat[length(n)], n[length(n)], x)
  #Finaly function to be returned.
  ps = function(x) psold(x)*lk(x)  
}
# Example of use:
auto(n = c(100, 50), dat = c(55, 60) )

答案 2 :(得分:0)

不确定我完全理解这个问题。我在for循环中添加了一个if语句来检查它是否是第一次迭代。如果是,它将根据您的原始陈述定义pr。如果不是,则通过pr(x)*定义前一次迭代的lk(x)函数,该函数由i-1子集。我确定我在这里错过了一些东西..

我也很困惑x输入的来源。

auto <- function(n, dat){

  for(i in 1:length(n)){
    if(i == 1){pr = function(x) dbeta(x, 1, 1)} else{pr = function(x) dbeta(x, 1, 1) * function(x) dbinom(dat[i-1], n[i-1], x)}
    lk = function(x) dbinom(dat[i], n[i], x)
    ps = function(x) pr(x)*lk(x)
  }
  curve(ps)
}
# Example of use:
auto(n = c(100, 50), dat = c(55, 60) )