如何将 sapply 应用于使用 match.call 的函数?

How to apply sapply to a function that uses match.call?

提问人:pomodoro 提问时间:7/13/2019 最后编辑:pomodoro 更新时间:7/13/2019 访问量:86

问:

我正在使用一个现有函数,该函数用于捕获输入并使用此输入定义数据框。我想用字符串名称的向量应用于与数据框中的变量名称匹配的函数。但是,该函数捕获 ,因此,这不起作用。match.callsapplysapplyi

任何指导将不胜感激。也对 的替代方法持开放态度。sapply

最小可重现示例:

# Generate data
dat = sapply(1:5, function(i){rnorm(n = 10, mean = i)})
dat = as.data.frame(dat)
> dat
          V1        V2       V3       V4       V5
1  2.7305301 3.2459056 2.366443 3.274836 4.902216
2  0.3809082 2.5033985 3.095093 2.675995 7.397180
3  1.8283385 0.4956617 2.004782 3.985234 4.689735
4  0.8450546 2.1390986 5.277488 6.052577 5.167756
5  2.7092999 4.0838629 1.683245 5.094684 5.306989
6  1.0471351 2.0033031 1.031404 3.126332 3.519315
7  0.2491428 0.3844910 2.670281 4.141592 5.318283
8  0.3319631 3.0790678 3.653437 1.500079 4.567699
9  0.9759534 0.7928414 3.549303 4.948636 4.952653
10 0.8205076 1.2129117 2.418991 4.833864 5.170205

# Toy function with match call
toy <- function(x, dataset){

  args <- as.list(match.call())

  x <- eval(args$x, dataset)
  if (class(x) == "character"){x <- get(x, dataset)}

  newdat = data.frame(x)

      return(newdat)

  }

# Example use of toy

toy(x = "V1", dataset = dat)
           x
1  2.7305301
2  0.3809082
3  1.8283385
4  0.8450546
5  2.7092999
6  1.0471351
7  0.2491428
8  0.3319631
9  0.9759534
10 0.8205076

# What I would like to do:
sapply(c("V1", "V2"), function(i){
  toy(x = i, dataset = dat)
})

Error in eval(args$x, dataset) : object 'i' not found
r match lazy-evaluation sapply

评论

0赞 pomodoro 7/13/2019
我对任何方法都持开放态度。唯一的限制是玩具功能本身不能改变。
1赞 Alexis 7/13/2019
您可以在里面使用:do.callsapplydo.call(toy, list(i, quote(dat)))
1赞 G. Grothendieck 7/13/2019
sapply(c("V1", "V2"), function(i) do.call("toy", list(i, quote(dat))))
0赞 pomodoro 7/15/2019
do.call 完美运行 - 谢谢!如果有人可以回答这个问题,我会将其标记为正确的解决方案。

答: 暂无答案