R:将向量转换为参数列表

时间:2019-02-11 03:47:47

标签: r

我想将函数应用于向量。但是,该函数需要一系列参数。因此,我需要将向量“拆分”为不相关的参数。

假设我有一个名为 dta 的数据框。我想在其其中一个列中运行一个函数,例如 mean ,例如DV。

以下显示了问题

call("mean", dta$DV)

返回

mean(c(0.371, -0.860, etc... ))

该列是向量的事实与 mean 函数不兼容,该函数需要一个参数序列,而不是组合在一起。

如果将“平均值”替换为包含字符串的变量,例如,

fun <- "mean"

call( fun, dta$DV)

1 个答案:

答案 0 :(得分:1)

R的功能不完全一致。例如,minmax接受任意数量的参数,在数学计算中会考虑所有无法识别的参数。 mean不是,它必须具有所有数字才能被视为第一个(或命名为x=)参数。

min(1,20,0)
# [1] 0
min(c(1,20,0))
# [1] 0
mean(1,20,0) # might not be what one would expect
# [1] 1
mean(c(1,20,0))
# [1] 7

出于好奇,不忽略20和0,第一个mean调用被解释为mean(0, trim=20, na.rm=0)(其中na.rm=0实际上与na.rm=FALSE相同)。

您对call的使用略有减少。在帮助?call中,

  

调用返回未评估的函数调用

并不能真正帮助您。您可能会做eval(call(...)),但是鉴于下一个功能,这似乎很愚蠢。

使用do.call更为直接。我可以将其作为第一个参数:函数(匿名或命名)或与函数匹配的字符串。使用一个或另一个之间实际上存在速度差异,因此我倾向于在可能时使用对功能名称的character引用。 (我不记得量化此断言的引用,如果很快找到它,我将包括它。)

对于像上面的min这样的函数,可以接受任意数量的参数,一个可以做到这一点:

args <- c(1,20,0)

as.list(args)
# [[1]]
# [1] 1
# [[2]]
# [1] 20
# [[3]]
# [1] 0
do.call("min", as.list(args)) # == min(1,20,0)
# [1] 0

list(args)
# [[1]]
# [1]  1 20  0
do.call("min", list(args)) # == min(c(1,20,0))
# [1] 0

但是,对于mean等,您需要强制执行后一种行为:

do.call("mean", list(args)) # == mean(c(1,20,0))
# [1] 7

要使用程序定义的参数调用函数,需要使用do.call