给定R函数auto
(下面),我想知道是否可能从for
的{{1}}循环输出的第二次运行用作ps
}?
例如,如果循环将要进行3次(即pr
),那么在循环的第一次运行中length(n) = 3
将按原样使用,但是从第二次运行开始,结果为从pr
开始的ps
(即ps(x)
)取代pr
到length(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`.
答案 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.1
和print(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) )