R语言有一个很好的功能,用于定义可以采用可变数量参数的函数.例如,该函数data.frame接受任意数量的参数,并且每个参数都成为结果数据表中列的数据.用法示例:
> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
letters numbers notes
1 a 1 do
2 b 2 re
3 c 3 mi
Run Code Online (Sandbox Code Playgroud)
函数的签名包括省略号,如下所示:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个类似的函数,获取多个值并将它们合并为一个返回值(以及进行一些其他处理).为了做到这一点,我需要弄清楚如何...从函数中的函数参数"解包" .我不知道该怎么做.功能定义中的相关行data.frame是object <- as.list(substitute(list(...)))[-1L],我无法理解.
那么如何将省略号从函数的签名转换为例如列表呢?
更具体地说,我如何写get_list_from_ellipsis下面的代码?
my_ellipsis_function(...) {
input_list <- get_list_from_ellipsis(...)
output_list <- lapply(X=input_list, FUN=do_something_interesting)
return(output_list)
}
my_ellipsis_function(a=1:10,b=11:20,c=21:30)
Run Code Online (Sandbox Code Playgroud)
似乎有两种可能的方法来做到这一点.他们是as.list(substitute(list(...)))[-1L]和list(...).但是,这两者并没有完全相同.(有关差异,请参阅答案中的示例.)任何人都可以告诉我它们之间的实际区别是什么,我应该使用哪一个?
标题不是超级描述性的,因为问题比我能想到的合理标题更长.
我希望有一个函数可以从其他函数中获取对象名,这些函数可以在另一个函数中用作参数.这是一个准确的尝试:
grab <- function(x) {
as.character(substitute(x))
}
FUN <- function(foo, bar = grab(foo)) {
bar
}
FUN(mtcars)
Run Code Online (Sandbox Code Playgroud)
在这里,我想FUN返回字符串"mtcars",但它返回"foo".如何制作一个抓取功能来执行此操作(我想这样做,因为我将使用它作为txt/csv等文件的默认设置.这是一个方便的设置.
以下是一些不成功的尝试(但我希望有一个通用的抓取功能):
FUN2 <- function(foo, bar = as.character(substitute(bar))) {
bar
}
FUN2(mtcars)
#==================
FUN3 <- function(foo, bar) {
if(missing(bar)) bar <- foo
as.character(substitute(bar))
}
FUN3(mtcars)
Run Code Online (Sandbox Code Playgroud)
现实生活中的例子:
real_example <- function(obj, file = grab(obj)) {
write.csv(obj, file = sprintf("%s.csv", file))
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
使用substitute获取参数名称
请注意,这与使用矢量本身list(...)或某种形式的东西不同....在完成任何解析之前,我希望能够做的只是'echo'传入的所有参数.
例如:我想要一个可能就像:
f(apple, banana, car)
## --> returns c("apple", "banana", "car"),
## ie, skips looking for the objects apple, banana, car
Run Code Online (Sandbox Code Playgroud)
我得到的最接近的是
f <- function(...) {
return( deparse( substitute( ... ) ) )
}
Run Code Online (Sandbox Code Playgroud)
但这只会返回第一个被"抓住"的参数....思考?
我想要rbind两个数据帧,在结果data.frame中有一个额外的列,指示哪个行来自哪个data.frame.例如,
top <- mtcars[1:16, ]
bottom <- mtcars[17:32, ]
rbind(top, bottom)
Run Code Online (Sandbox Code Playgroud)
这会给我,
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 …Run Code Online (Sandbox Code Playgroud)