作为函数(R)参数的函数列表

x7yiwoj4  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(173)

我有个问题:我需要在另一个函数中一遍又一遍地运行同一个函数,但参数不同,我如何直接实现它,因为我目前使用的手动方法会产生大量代码,使代码无法阅读?
伪代码:

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

先谢谢你!

ogq8wdun

ogq8wdun1#

只是猜测什么可能对你有用发现很难从你的伪代码中猜测出来......不管怎样,这里有一些小代码,它们制造了一个函数列表,每个函数都有一个不同的参数(这会改变它们将生成多少数字);这些被传递到对它们的结果进行操作的外部函数

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
mitkmikd

mitkmikd2#

我不确定我是否正确理解了您的问题,但据我所知,这是解释应用函子的好方法,所以我用Scala编写了一些代码。
应用函子具有ap函数,其签名如下:
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循环,这样你仍然可以在前后做一些事情。

相关问题