从头开始制作R promise对象(延迟评估)

kda*_*ria 8 r lazy-evaluation

我想懒惰地读取来自不同文本文件的数据,类似于延迟加载数据集(例如,iris在R中输入懒惰加载来自datasets包的数据集).这里的不同之处在于,expression只要某个变量(这里我使用x)被输入R控制台或被其他一些代码使用,我就想运行一个R.

# The expression that I want run if the variable x is called by some other code
expn = quote( {x = read.table(text = "a b  \n 1 2", header=TRUE)} )

# When I type this, I want the language object 'expn' to be evaluated
# (e.g. eval(expn)) so that the variable x now exists
x
Run Code Online (Sandbox Code Playgroud)

有没有办法用R promise对象做到这一点?我必须创建一个R包来获得这种行为吗?

Mat*_*rde 10

你在找delayedAssign.

delayedAssign('x', read.table(text = "a b  \n 1 2", header=TRUE))
Run Code Online (Sandbox Code Playgroud)

您可以看到表达式在x首次请求时执行:

delayedAssign('x', {
      message('assigning')
      read.table(text = "a b  \n 1 2", header=TRUE)
  })
x
# assigning
#   a b
# 1 1 2
Run Code Online (Sandbox Code Playgroud)