在R中创建承诺/延迟计算表达式
我想以编程方式在R中创建一个承诺。我知道语言支持它。但出于某种原因,似乎没有办法做到这一点 更详细地说:我希望对列表的组件进行延迟评估。例如在R中创建承诺/延迟计算表达式,r,promise,lazy-evaluation,coroutine,R,Promise,Lazy Evaluation,Coroutine,我想以编程方式在R中创建一个承诺。我知道语言支持它。但出于某种原因,似乎没有办法做到这一点 更详细地说:我希望对列表的组件进行延迟评估。例如 x <- list(node=i, children=promise(some_expensive_function(i)) x目前,您的用例太模糊,我无法理解。我想知道quote、expression或call中是否有一个是您想要的: x <- list(node=i, children=quote(mean(i)) ) x #-----
x <- list(node=i, children=promise(some_expensive_function(i))
x目前,您的用例太模糊,我无法理解。我想知道quote
、expression
或call
中是否有一个是您想要的:
x <- list(node=i, children=quote(mean(i)) )
x
#----------
$node
[1] 768
$children
mean(i)
#------------
x <- list(node=i, children=call('mean',i))
x
#-------------
$node
[1] 768
$children
mean(768L)
#-----------
x <- list(node=i, children=expression(mean(i)) )
x
#------------
$node
[1] 768
$children
expression(mean(i))
任何具有一流函数(包括R)的编程语言都可以很容易地通过thunks()实现惰性计算
基本思想是函数在被调用之前不会被计算,所以只需将列表中的元素封装在匿名函数中,这些匿名函数在被调用时返回它们的值
delayed <- list(function() 1, function() 2, function () 3)
lapply(delayed, function(x) x())
delayed我最终使用了环境和delayedAssign
node <- new.env()
node$name <- X[1, 1]
r$level <- names(X)[1]
delayedAssign('subtaxa', split_taxons_lazy(X[-1]), assign.env=node)
node
node我建议您使用“廉价”函数编写更多的代码。这正是我现在使用的。我认为这是不雅观的,因为需要记住这些是函数,并显式地对它们进行评估(这对于需要使用我的代码的其他用户来说尤其有问题)。如果表达式可以隐式地延迟计算,那就太好了。当然,在这一点上,我对这个解决方案的厌恶是相当挑剔的。我只是想找到最实用、最可维护的解决方案。用例非常简单。我有一个生成搜索树的函数,还有一堆其他函数遍历这棵树。搜索树可能非常大,但只需要遍历很少的分支。通过惰性地评估子树,我可以将性能提高200倍或更多,同时保持代码简洁。另一个解决方案是合并树生成和树行走代码,但出于API设计原因,我不想这样做。你的建议基本上与詹姆斯在上述答案中所提供的相同。它仍然需要明确的评估。
node <- new.env()
node$name <- X[1, 1]
r$level <- names(X)[1]
delayedAssign('subtaxa', split_taxons_lazy(X[-1]), assign.env=node)
node