簡體   English   中英

作為參數的功能列表 function (R)

[英]List of functions as parameter of function (R)

我有一個問題:我需要在另一個 function 中一遍又一遍地運行相同的 function,但參數不同。我怎樣才能直接實現它,因為我目前正在執行的手動方法會產生很多代碼並使我的代碼不可讀?

偽代碼:

internal_func <- function(x, y, z)

external_func <- function(list_of_functions) {
   # do some stuff

   for(i in 1:length(list_of_functions)){
      # evaluate the internal function and save the results in a matrix
   }

   # do some more stuff
   return(stuff)
}

# run 1
# generate list of internal_func with varying x and pass it to external_func

# run 2
# generate list of internal_func with varying y and pass it to external_func

# run 3
# generate list of internal_func with varying y and pass it to external_func

編輯:更多解釋:我的內部 function 運行模擬 100 次,例如,給我所有模擬的人口規模的平均值。 各個模擬采用一組參數並返回所有時間步長的矩陣。

例如,在外部 function 中,我想測量一組模擬的平均值,我一次只更改模擬的一個參數。 然后,生成它的 plot。

先感謝您!

只是猜測什么對你有用; 發現很難從你的偽代碼中猜出......無論如何,這里有一些小代碼可以生成一個函數列表,每個函數都有不同的參數(這會改變它們將生成的數字數量); 這些被傳遞給一個對其結果進行操作的外部函數


library(purrr)

my_partials <- map(1:5,\(x_)
    partial(.f=rnorm,n=x_))

outerfunc <- function(func){
  round(func(),0)
}
map(my_partials,outerfunc)
[[1]]
[1] 1

[[2]]
[1]  1 -1

[[3]]
[1] 0 0 0

[[4]]
[1]  1  0  0 -1

[[5]]
[1] -1  2  1  1  0

我不太確定我是否正確理解了你的問題,但據我所知,這是解釋應用函子的好方法,所以我用 Scala 編寫了一些代碼。

Applicative functor 的ap function 具有以下簽名:

def ap[A, B](ff: F[A => B])(fa: F[A]): F[B]

F 是一個函子,就像List一樣,實際上List是一個應用函子!

所以我們可以寫:

序幕:

import cats.implicits._

type X = Int
type Y = Int
type Z = Int
type R = Int

cats 為我們提供了List的應用實例和類型別名,因此我們接下來有漂亮的代碼:

val f: X => Y => Z => R = x => y => z => x + y + z
val g: X => Y => Z => R = x => y => z => x - y - z

val internal_func = List(f, g)

// generate list of internal_func with varying x
((internal_func ap List(1, 2, 3)) ap List(5)) ap List(40)
// res36: List[R] = List(46, 47, 48, -44, -43, -42)

// generate list of internal_func with varying y
((internal_func ap List(10)) ap List(3, 4, 5)) ap List(2)
// res37: List[R] = List(15, 16, 17, 5, 4, 3)

// generate list of internal_func with varying z
((internal_func ap List(20)) ap List(3)) ap List(4,5,6)
// res38: List[R] = List(27, 28, 29, 13, 12, 11)

結果不是那么干凈,我相信它可以改進。 但想法是前 3 個條目是 f(x, y, z) 改變一個變量,后 3 個條目是 g(x, y, z) 改變一個變量。

它甚至可以在一次執行中完成,將所有變體設置在一起,但對於這個解釋,閱讀不是那么清楚。

我希望它適合你的問題! 內聯ap將替換您的 for 循環,因此您仍然可以在之前和之后做一些事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM