转动将R函数转换为字符串
在R中,我想编写一个函数,它接受一组参数,但不计算它们,并将整个参数集作为字符串返回。我找到了以下方法:转动将R函数转换为字符串,r,dplyr,R,Dplyr,在R中,我想编写一个函数,它接受一组参数,但不计算它们,并将整个参数集作为字符串返回。我找到了以下方法: ff = function(...) { dots = dplyr::enquos(...) strs = sub("^[~]","=",sapply(dots,deparse)) return(paste(paste(names(strs),strs,sep=""),collapse=",")) } 但似乎必须有一种更简单、更不脆弱的方法来实现这一点,它不依赖于使用基本R函数
ff = function(...) {
dots = dplyr::enquos(...)
strs = sub("^[~]","=",sapply(dots,deparse))
return(paste(paste(names(strs),strs,sep=""),collapse=","))
}
但似乎必须有一种更简单、更不脆弱的方法来实现这一点,它不依赖于使用基本R函数quote
和deparse
,但我无法理解
有更好的方法吗?您可以使用
match.call()
:
或者,如果只需要点,而不需要潜在的位置参数,只需将该函数的第一行更改为
args = match.call(expand.dots = FALSE)$...
您可以使用
match.call()
:
或者,如果只需要点,而不需要潜在的位置参数,只需将该函数的第一行更改为
args = match.call(expand.dots = FALSE)$...
在上述康拉德解决方案的基础上,这里是我使用的最后一个函数:
ff = function (...) {
args = match.call(expand.dots=FALSE)$...
argvalues = vapply(args, deparse, character(1L))
paste(ifelse(names(args)=="",argvalues,
paste(names(args), argvalues, sep = ' = ')),
collapse = ', ')
}
使用此功能,我可以执行以下操作:
> ff(a=1,b=zzz)
[1] "a = 1, b = zzz"
> ff(a=1,zzz)
[1] "a = 1, zzz"
在上述康拉德解决方案的基础上,这里是我使用的最后一个函数:
ff = function (...) {
args = match.call(expand.dots=FALSE)$...
argvalues = vapply(args, deparse, character(1L))
paste(ifelse(names(args)=="",argvalues,
paste(names(args), argvalues, sep = ' = ')),
collapse = ', ')
}
使用此功能,我可以执行以下操作:
> ff(a=1,b=zzz)
[1] "a = 1, b = zzz"
> ff(a=1,zzz)
[1] "a = 1, zzz"
顺便说一句,您的代码不需要使用dplyr,
enquos
函数来自rlang;dplyr只是重新导出它。您可以使用rlang::quo_text
而不是deparse
来获取没有前导~
的quosure文本(顺便说一下,它不需要在正则表达式中转义)。如何调用此ff
函数?您能展示一些示例输入和预期输出吗?感谢Konrad提供的有见地的评论。关于我如何称呼它,通常是像ff(eval=!file.exists(“blah”),connection=“con”)这样的东西,但我想保留像ff(mychunk,eval=!file.exists(“blah”)这样的东西的可能性,这就是为什么我问Konrad下面关于未命名参数的问题。顺便说一句,您的代码不需要使用dplyr,enquos
功能来自rlang;dplyr只是重新导出它。您可以使用rlang::quo_text
而不是deparse
来获取没有前导~
的quosure文本(顺便说一下,它不需要在正则表达式中转义)。如何调用此ff
函数?您能展示一些示例输入和预期输出吗?感谢Konrad提供的有见地的评论。关于如何称呼它,通常是像ff(eval=!file.exists(“blah”),connection=“con”)这样的东西,但我想保留像ff(mychunk,eval=!file.exists(“blah”)这样做的可能性,这就是为什么我问Konrad下面关于未命名参数的问题。我不确定我是否完全理解它,但这是一个很大的帮助。谢谢你的快速回复。有一件事:如果我执行ff(a=1,zzz),它将返回“a=1,=zzz”。有没有一个简单的方法来解决这个问题?我不确定我是否完全理解它,但这是一个很大的帮助。谢谢你的快速回复。有一件事:如果我执行ff(a=1,zzz),它将返回“a=1,=zzz”。有没有简单的方法来解决这个问题?