Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转动将R函数转换为字符串_R_Dplyr - Fatal编程技术网

转动将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函数

在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”。有没有简单的方法来解决这个问题?