R:在用户定义的 Fn 中,我可以合并延迟命令,可能需要用户输入吗?

R: In a User-defined Fn, can I incorporate delayed commands, possibly with user input?

我正在尝试创建一个用户定义的函数(我们称它为 udf),它将允许我组合几行代码以使其更简洁且更易于阅读。

我们举一个简单的例子。当我使用 tiff 函数(或几乎任何输出函数:pngjpeg、...)时,我必须以 dev.off() 结束它,我是想知道我是否可以创建一个函数来执行以下操作:

udf <- function(title)
{tiff(filename=title)
   *execute the next line of code in my R script*
   dev.off()
}

所以我可以把3行代码变成2行,即:

tiff("plot.tiff")             # >>>>>>>>>>>    udf("plot.tiff")
plot(x)                       # >>>>>>>>>>>    plot(x)
dev.off()

根据我在网上找到的内容,一个解决方案是将 "dev.off()" 延迟 1 秒,但这似乎效率不高,而且我相信函数 delay 无论如何都已失效. 所以我相信我正在尝试探索三种选择。或者上面那个,它会等待接收下一行代码,然后在dev.off()之前执行它,或者:

也许是一个可以执行的带有参数的函数,即:

udf <- function(title, arg)   # >>>>>>>>>>>    udf("plot.tiff", plot(x))           
{tiff(filename=title)         # >>>>>>>>>>>    That would make it one line!
   *execute(arg)*          
   dev.off()
}

或者可能是一种执行用户输入提示的方法,即:

udf <- function(title)
{tiff(filename=title)
   n <- prompt="Enter a command: "
   *execute(n)*
   dev.off()
}

甚至可能还有另一个我想不到的选择,但网络上似乎没有任何内容,也许我在搜索中没有使用关键字,但我们将不胜感激。谢谢!

最好, @UpAndComing

您不能 "capture" 后续函数调用,但您可以将代码块传递给函数调用。例如,简单的

udf <- function(title, code) {
   cat("start - ", title, "\n")
   code
   cat("end\n")
}

udf("hello", cat("ok\n"))
# start -  hello 
# ok
# end

在你的例子中看起来像

udf("plot.tiff", plot(x) )

如果你有多个表达式,你可以使用大括号。

udf("plot.tiff", {
  plot(x)
  plot(y)
} )