Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中创建承诺/延迟计算表达式_R_Promise_Lazy Evaluation_Coroutine - Fatal编程技术网

在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 #-----

我想以编程方式在R中创建一个承诺。我知道语言支持它。但出于某种原因,似乎没有办法做到这一点

更详细地说:我希望对列表的组件进行延迟评估。例如

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