R 具有多个参数的映射,其中一个参数为常量(数据)

R 具有多个参数的映射,其中一个参数为常量(数据),r,mapply,R,Mapply,在我构造的函数中,如果有一个或多个参数是必需的,因为我在一个更大的环境中编程,例如,如果我编写一个函数,其中一个参数是数据,那么我正在努力使用mapply 我试图理解mapply是如何工作的;我肯定不能通过mtcars,作为一个向量,我能通过共青团吗 编辑:我的环境中的数据可能会有所不同,例如,有时我使用mtcars,有时它是另一个数据集。因此,我无法将数据硬编码到函数中 fun_test <- function(data,col,val1,val2){ browser() r

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

我试图理解mapply是如何工作的;我肯定不能通过mtcars,作为一个向量,我能通过共青团吗

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

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
编辑2: 我有一些数据集, 2我有不同的Excel文件读入R, 3我制作了一个查找函数,从R中的这些Excel文件中提取信息, 4在我进入我创建的查找函数并提取信息时,数据集中的一个或两个变量

因此,这些查找函数既取决于我需要查找的数据变量,也取决于我用来查找的Excel文件。

mapply是一个多维Lappy。这意味着它不是只迭代一个对象,即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是一个多维lappy。这意味着它不是只迭代一个对象,即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)

如果您想将dataframe作为常量值传递,请将其作为列表传递,以便完全回收,否则它将在mapply中单独传递每一列

我知道这是一个示例,实际的实现是不同的,但是您可以通过执行以下操作直接获得相同的输出

mtcars[1, "cyl"] * mtcars$cyl - mtcars$cyl*2
为了理解这两个调用之间的差异,我们可以调试函数,在函数中添加浏览器

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, ]
mtcars$mpg[cyl][1,]中存在错误:尺寸数不正确

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

它是完整的数据帧,然后您可以从中获得子集

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

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

如果要将数据帧作为常量值传递,请将其作为列表传递,以便完全回收,否则它将在mapply中单独传递每一列

我知道这是一个示例,实际的实现是不同的,但是您可以通过执行以下操作直接获得相同的输出

mtcars[1, "cyl"] * mtcars$cyl - mtcars$cyl*2
为了理解这两个调用之间的差异,我们可以调试函数,在函数中添加浏览器

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, ]
mtcars$mpg[cyl][1,]中存在错误:尺寸数不正确

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

它是完整的数据帧,然后您可以从中获得子集

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

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

很抱歉,可能我不够清楚,但我的环境中的数据可能会有所不同,例如,有时我使用mtcars,有时它是另一个数据集。因此,我无法将数据硬编码到函数中。对不起,可能我不够清楚,但我的环境中数据可能会有所不同,例如,有时我使用mtcars,有时它是另一个数据集。所以我无法将数据硬编码到函数中。你能详细说明一下完全回收列表的意思吗?至于上下文,正如我在OP的编辑中提到的:1我有一些数据集,2我有不同的Excel文件读入R,3我做了一个查找函数,从R中的这些Excel文件中提取信息,当我进入我创建的查找函数并提取信息时,对于数据集中的一个或两个变量,@Erosennin我已经添加了一些解释。我认为这应该添加到R文档中
由于MoreArgs参数的存在是一个混乱的来源。你能详细说明一下完全回收列表的意思吗?至于上下文,正如我在OP的编辑中提到的:1我有一些数据集,2我有不同的Excel文件读入R,3我做了一个查找函数,从R中的这些Excel文件中提取信息,在我进入我创建的查找函数并提取信息时,数据集中有一个或两个变量。@Erosennin我已经添加了一些解释。我认为这应该添加到R文档中,因为MoreArgs参数的存在会引起混淆。@akrun:您确定这是重复的吗?我正在努力了解这对我有什么帮助。Map是mapply的包装器,我想问题是其中一个参数是常数。因此,您需要将其包装在一个列表中,这是dupe链接中提供的解决方案。如果你不同意,我可以reopen@akrun:我明白了,也许我写常量的时候太含糊了。我的意思是参数没有改变,但常数参数本身不是常数,而是我的数据。我的意思是数据或输入对每个列表元素都是重复的。这就是为什么您使用mapplyFUN=fun\u test、listmtcars、cyl、mtcars$cyl、mtcars$cyl*2得到答案,其中数据包装在list@akrun:谢谢你的详细说明!Tbh,我不明白他们是有关联的,我在问问题之前读过这个答案,但如果你想把它关闭,我understand@akrun:你确定这是重复的吗?我正在努力了解这对我有什么帮助。Map是mapply的包装器,我想问题是其中一个参数是常数。因此,您需要将其包装在一个列表中,这是dupe链接中提供的解决方案。如果你不同意,我可以reopen@akrun:我明白了,也许我写常量的时候太含糊了。我的意思是参数没有改变,但常数参数本身不是常数,而是我的数据。我的意思是数据或输入对每个列表元素都是重复的。这就是为什么您使用mapplyFUN=fun\u test、listmtcars、cyl、mtcars$cyl、mtcars$cyl*2得到答案,其中数据包装在list@akrun:谢谢你的详细说明!Tbh,我不明白他们之间有什么关联,我在问问题之前读过这个答案,但如果你想把它关闭,我明白