R:在用户定义的 Fn 中,我可以合并延迟命令,可能需要用户输入吗?
R: In a User-defined Fn, can I incorporate delayed commands, possibly with user input?
我正在尝试创建一个用户定义的函数(我们称它为 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
您不能 "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)
} )
我正在尝试创建一个用户定义的函数(我们称它为 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
您不能 "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)
} )