首页 > 解决方案 > R:在用户定义的 Fn 中,我可以合并延迟命令,可能带有用户输入吗?

问题描述

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

让我们举一个简单的例子。当我使用该tiff函数(或几乎任何输出函数:png, jpeg,...)时,我必须以 结束它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

标签: ruser-defined-functionsdelayed-execution

解决方案


您不能“捕获”后续函数调用,但可以将代码块传递给函数调用。例如,用一些简单的东西

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)
} )

推荐阅读