我正在尝试创建一个函数列表,其中每个函数略有不同。以下代码工作正常:
fun1 <- function(n) {
fun2 <- function(x) {
x^n
}
return(fun2)
}
powerfuns <- vector("list", 3)
powerfuns[[2]] <- fun1(2)
powerfuns[[3]] <- fun1(3)
powerfuns[[2]](4)
# [1] 16
powerfuns[[3]](4)
# [1] 64
列表的第二个元素是一个对其参数求平方的函数,而第三个元素是一个对其参数进行多维数据集的函数。但是,如果我使用for循环创建列表,它似乎不起作用:
powerfuns <- vector("list", 3)
for (i in 1:3) {
powerfuns[[i]] <- fun1(i)
}
powerfuns[[2]](4)
# [1] 64
powerfuns[[3]](4)
# [1] 64
现在两个函数都会复制它们的参数。似乎有一些关于for循环的东西导致函数的环境相同。 get(&#34; n&#34;,environment(powerfuns [[2]]))在第二个例子中返回3,但在第一个例子中返回2。有没有人有关于如何使用循环或类似的东西得到我想要的结果的建议?谢谢!
答案 0 :(得分:3)
这与懒惰的评估有关。由于unapply
不会立即使用您传入的值implicit val translations = Map(
"w" -> "width",
"h" -> "height",
"l" -> "left",
"r" -> "right",
"t" -> "top",
"b" -> "bottom",
// + some more translations
"m" -> "multiplied by"
)
sealed trait CommandType
object CommandType {
case object Unmodified extends CommandType
case object Multiplied extends CommandType
// ...
}
object Untranslation {
def unapply(s: String)(implicit t: Map[String, String]): Option[CommandType] = {
val key: String = "w" // should be variable by case
val a: List[String] = t(key).split(" ").toList
val b: List[String] = t("m").split(" ").toList
val ab: List[String] = a ++ b
s.split(" ").toList match {
case `a` => Some(CommandType.Unmodified)
case `ab` :+ value => Some(CommandType.Multiplied)
// + some more cases
case _ => None
}
}
}
"width multiplied by 2" match {
case Untranslation(v) => println(v) // here I would like to pass the key ("w"/"h"/"l"/...)
case _ => println("nothing found")
}
// outputs: Multiplied
,因此它不会以您期望的方式捕获值。您可以使用
fun1
然后你可以运行相同的代码
n