0

リストがあるとします:

> fs
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] 61.90298 58.29699 54.90104 51.70293 48.69110

リストの値を使用して、残りのリストを「逆塗り」したいと思います。例:

にはペアの[[3]]関数値が必要です。[[4]]

c( myFunction(fs[[4]][1], fs[[4]][2]), myFunction(fs[[4]][2], fs[[4]][3]), .... )

などの値を[[2]]持つ必要があります...myFunction[[3]]

それが明確であることを願っています。それを行う正しい方法は何ですか?ループ用?*該当しますか? 1-3空のままの私の最後の試み:

n = length(fs)
for (i in rev(1:(n-1)))
  child_fs = fs[[i+1]]
  res = c()
  for (j in 1:(i+1))
    up = v(child_fs[j])
    do = v(child_fs[j+1])
    this_f = myFunction(up, do)
    res[j] = this_f
  fs[[i]] = res  
4

3 に答える 3

1

本当に、あなたが持っているものは出発点です

start <- c(61.90298, 58.29699, 54.90104, 51.70293, 48.69110)

適用したい関数 (私はこれを作成し、どこでも 1 を追加し、最後の要素を削除します)

myFunction <- function(x) head(x + 1, -1L)

関数を(再帰的に)適用する回数:

n <- 3L

したがって、関数時間を再帰的に適用する関数を作成しn、出力リストを逆にします。

apply.n.times <- function(fun, n, x)
   if (n == 0L) list(x) else c(list(x), Recall(fun, n - 1L, fun(x)))

rev(apply.n.times(myFunction, n, start))

# [[1]]
# [1] 64.90298 61.29699
# 
# [[2]]
# [1] 63.90298 60.29699 56.90104
# 
# [[3]]
# [1] 62.90298 59.29699 55.90104 52.70293
# 
# [[4]]
# [1] 61.90298 58.29699 54.90104 51.70293 48.69110
于 2013-04-19T19:31:24.027 に答える
0

これは1行の解決策です(myFunctionをsumのようなものに置き換えることができる場合、またはこの場合はrowSums):

Reduce( function(x,y) rowSums( embed(y,2) ), fs, right=TRUE, accumulate=TRUE )

myFunction が 2 つの値を受け入れて何かを行う必要がある場合、これは次のように少し拡張できます。

Reduce( function(x,y) apply( embed(y,2), 1, function(z) myFunction(z[1],z[2]) ), 
    fs, right=TRUE, accumulate=TRUE )
于 2013-04-19T20:43:35.847 に答える