1

我有两个功能,一个在另一个里面

fun.a <- function (y,smth) { 
    z <- y*3
    sapply(smth,FUN = fun.b) 
}
fun.b <- function(x) {
    return(x+z)
}

如果我运行:

fun.a(2, c(1, 2, 3))

我收到一条错误消息,因为z“较低级别”功能中不存在fun.bz但是在使用sapplyin时我无法传递值fun.a

也许它存在一个允许在函数内部创建一个也存在于外部的对象的函数?如何解决这个问题呢?

编辑:我不想在fun.b里面复制粘贴fun.a,也不想sapplyfor-loop. 在这种情况下,解决方案仍然存在吗?

4

2 回答 2

2

这有效,您使用...参数将任何附加值传递给fun.b

fun.a <- function (y,smth) { 
    z <- y*3
    sapply(smth,FUN = fun.b, z = z) 
}
fun.b <- function(x, z) {
    return(x+z)
}
fun.a(2, c(1, 2, 3))
于 2013-03-31T11:55:48.050 回答
0

如果您不允许修改fun.b,我从评论中收集到,那么,在 的正文中fun.a,创建一个副本fun.b并为其附加一个环境:

fun.a <- function (y,smth) { 
  e <- new.env()
  assign("z", y*3, envir = e)
  fun.b.copy <- fun.b
  environment(fun.b.copy) <- e
  sapply(smth,FUN = fun.b.copy)
}

如果您可以修改函数获取输入的方式,我仍然更喜欢@Paul 的解决方案。他的回答是推荐的编程方式。

于 2013-03-31T12:09:02.333 回答