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

时间:2019-07-13 09:43:58

标签: r match lazy-evaluation sapply

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

任何指导将不胜感激。也开放使用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

0 个答案:

没有答案