Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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 - Fatal编程技术网

R 参数数目未知时简洁地传递参数

R 参数数目未知时简洁地传递参数,r,R,许多R函数的参数数量可变。sum就是一个例子:sum1、2、sum1、2、3和sum1、2、3、4都是有效的命令 我需要编写以批处理模式运行的脚本。在这些脚本中,我需要向函数传递多个参数。参数将不会从命令行传入。它们必须是变量,而不是对应于变量名的字符串。它们将属于同一类,它们的名称将以相同的字符开头,但我不知道名称或参数的数量。是否有一种简洁的方法将变量传递给函数 下面是一个示例:我希望代码生成所有名称为^int\\d$模式的变量的总和。我知道至少有一个这样的变量,但我不知道有多少。此代码适用

许多R函数的参数数量可变。sum就是一个例子:sum1、2、sum1、2、3和sum1、2、3、4都是有效的命令

我需要编写以批处理模式运行的脚本。在这些脚本中,我需要向函数传递多个参数。参数将不会从命令行传入。它们必须是变量,而不是对应于变量名的字符串。它们将属于同一类,它们的名称将以相同的字符开头,但我不知道名称或参数的数量。是否有一种简洁的方法将变量传递给函数

下面是一个示例:我希望代码生成所有名称为^int\\d$模式的变量的总和。我知道至少有一个这样的变量,但我不知道有多少。此代码适用于:

# Set up toy data
int1 <- 3
int2 <- 5

# Get the sum
argNames <- ls(pat='^int\\d$')
argNames.list <- as.list(argNames)
argNames.list <- lapply(argNames.list, function (x) get(x))
do.call(sum, argNames.list)
我的反对意见是这个代码有点麻烦。将操作分散在四行上会降低清晰度。有没有一种R-惯用的方法可以用更少的代码行获得相同的结果?

编辑以更好地解决这个问题

我不认为你能做得比这更好,这对我来说似乎是微不足道的

int1 <- 3
int2 <- 5

do.call(sum, lapply(ls(pat="^int\\d$"), get))
# [1] 8

## Or use a safer version that will only look for objects located in the 
## environment from which it was called.  
do.call(sum, lapply(ls(pat="^int\\d$"), get, envir=parent.frame(), inherits=FALSE))

将其封装在函数中并消除lappy和get稍微简单一些。ix保存匹配名称的索引

# sum those arguments whose names match ^int\\d$
sumint <- function(...) {
    arg.names <- as.character(match.call()[-1])
    ix <- grep("^int\\d$", arg.names)
    do.call("sum", list(...)[ix])
}

# test    
a <- b <- 10
int3 <- 30
sumint(a, int3, b, int3, b, pi) # 60

谢谢这是有帮助的,但它似乎不再简洁。即使在定义了flexFun之后,我似乎仍然需要使用四行代码,因为我不知道要传递给flexFun的变量的名称。是这样,还是我遗漏了什么?我正在处理的函数要求它的参数是一个特殊类的变量,而不是对应于变量名的字符串。我将编辑原始帖子以添加此详细信息。您是否想要类似的内容?您可以确保所有想要的变量都包含在特定的环境中,并使用?eapply@baptiste-谢谢。这也行得通;这是一个好主意。如果您要在批处理模式下运行它,您可以使用commandArgs访问参数。@RomanLustrik-谢谢。但是commandArgs对我没有帮助:脚本将以批处理模式运行,但参数不会从命令行传递。我想我的假设是错误的,我的错误: