mapply 有多个参数,其中一个参数是常量(数据)

mapply with multiple arguments where one argument is constant (data)

我正在努力在我构造的函数上使用 mapply,因为我在一个更大的环境中编程,所以我需要一个或多个参数,例如,如果我编写一个函数,其中一个参数是 数据.

fun_test <- function(data,col,val1,val2){return(data[col][1,] * val1-val2)}

所以 datacol 例如可以是常量,但我想根据 [=24 改变函数的输出=]val1 和 val2:

> mapply(FUN=fun_test,mtcars,"cyl",mtcars$cyl,mtcars$cyl*2)
Error in data[col][1, ] : incorrect number of dimensions

我正在尝试了解 mapply 的工作原理;我肯定不能通过 mtcars 和 "cyl" 作为向量,我可以吗?

编辑:我有一个数据可能不同的环境,例如有时我使用 mtcars,有时它是另一个数据集。所以我不能将数据硬编码到函数中

EDIT2: 1)我有数据一些数据集, 2)我有不同的Excel-我读入R的文件, 3)我做了一个查找函数,从 R 中的这些 Excel 文件中提取信息, 4) 在我进入我创建的查找函数并提取信息时,对于一个或两个变量(来自数据集)。

所以这些查找函数取决于数据(我需要查找的变量)和我用来查找的 Excel 文件。

mapply 是多维的 lapply。这意味着它不是只迭代一个对象(即 data.frame 的列或向量的元素),而是同时迭代多个对象。唯一的条件是这些对象的长度必须相同,即 data.frame 的列和向量的长度。所以,你不能传递常量(除非你传递一个相同常量的向量来匹配长度,但你为什么要这样做)。

尝试一个简单的例子(对向量的相同索引求和):

mapply(sum, 1:10, 11:20)

因此,在您的情况下,只需将常量直接传入函数即可:

fun_test <- function(val1, val2){return(mtcars['cyl'] * val1 - val2)}

mapply(FUN=fun_test, mtcars$cyl, mtcars$cyl*2)

更新:

那么我认为你需要的是在你的函数中包含 mapply。这样你就可以添加任何你喜欢的参数(常量和变量)。它看起来像这样:

myfunc <- function(data, col, val1, val2) {

  fun_test <- function(val1, val2) {
    data[col] * val1 - val2 
  }

  mapply(FUN=fun_test, val1, val2)

}

myfunc(mtcars, 'cyl', mtcars$cyl, mtcars$cyl*2)

如果你想将数据帧作为常量值传递,将其作为列表传递,以便它被完全回收,否则它将在 mapply

中单独传递每一列
fun_test <- function(data,col,val1,val2){return(data[1, col] * val1-val2)}

mapply(FUN=fun_test, list(mtcars),"cyl",mtcars$cyl,mtcars$cyl*2)
#[1] 24 24 16 24 32 24 32 16 16 24 24 ......

所以输出中的第一个值 24 可以被

重现
mtcars[1, "cyl"] * mtcars$cyl[1] - mtcars$cyl[1]*2
#[1] 24

我知道这是一个例子,实际的实现是不同的,但你可以通过

直接得到相同的输出
mtcars[1, "cyl"] * mtcars$cyl - mtcars$cyl*2

要了解这两个调用之间的区别,我们可以调试函数,在函数

中添加 browser()
fun_test <- function(data,col,val1,val2){
   browser()
   return(data[1, col] * val1-val2)
}

现在,调用函数,检查函数中的参数

mapply(FUN=fun_test, mtcars,"cyl",mtcars$cyl,mtcars$cyl*2)
Browse[1]> data
# [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 
#     10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 
#     15.8 19.7 15.0 21.4

这是 mtcars 中的第一列,即 mpg(检查 mtcars$mpg)。

它是一个数值向量,现在您正尝试从中提取 mpg 列和索引 1 的子集,这给您带来相同的错误

mtcars$mpg["cyl"][1, ]

Error in mtcars$mpg["cyl"][1, ] : incorrect number of dimensions

现在在第二种情况下,当我们将数据帧作为列表传递时,检查 data

 mapply(FUN=fun_test, list(mtcars),"cyl",mtcars$cyl,mtcars$cyl*2)

Browse[1]> data
#                     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    1
#Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#....

这是完整的数据框,然后您可以从中提取子集

>data[1, "cyl"]
#[1] 6

PS - 我不知道 为什么 这样做的背景,我相信会有更好的方法来处理它。