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)}
所以 data 和 col 例如可以是常量,但我想根据 [=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 - 我不知道 为什么 这样做的背景,我相信会有更好的方法来处理它。
我正在努力在我构造的函数上使用 mapply,因为我在一个更大的环境中编程,所以我需要一个或多个参数,例如,如果我编写一个函数,其中一个参数是 数据.
fun_test <- function(data,col,val1,val2){return(data[col][1,] * val1-val2)}
所以 data 和 col 例如可以是常量,但我想根据 [=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 - 我不知道 为什么 这样做的背景,我相信会有更好的方法来处理它。