Как использовать вектор в качестве аргумента функции с несколькими параметрами в r - PullRequest
1 голос
/ 09 апреля 2019

У меня есть функция с четырьмя параметрами, три из которых взяты из данного кадра данных.Я хочу иметь возможность использовать функцию с данным фреймом данных, используя вектор чисел в качестве аргумента для четвертого параметра.Я знаю, как делать с одним значением за раз, но я уверен, что есть прямой способ сделать это, возможно, используя for loop

Вот пример, в котором a и b являются переменными из dfdataframe, c - количество строк в df, а d - вектор целых чисел от 1 до 3, скажем, так:

set.seed(42)    
a<-runif(100,1,100)    
b<-runif(100,1,100)    
df<-data.frame(a,b)    

fun1 <- function (a, b, c, d) {    
z <- sum (( a - d ) * b / c )    
return(z)    
}    

Если я запускаю его по одному значению за раз:

fun1(df$a, df$b, nrow(df), 1)    
fun1(df$a, df$b, nrow(df), 2)    
fun1(df$a, df$b, nrow(df), 3)    


> fun1(df$a, df$b, nrow(df), 1)    
>[1] 2696.223    
> fun1(df$a, df$b, nrow(df), 2)    
>[1] 2643.748    
> fun1(df$a, df$b, nrow(df), 3)    
>[1] 2591.273

Что я хочу сделать, это что-то вроде этого (он должен вернуть все три значения одновременно):

fun1(df$a, df$b, nrow(df), c(1:3))

Надеюсь, я был ясен.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вы можете использовать команду "map" из пакета purrr. Вы можете установить purrr из команды, используя install.packages("purrr")

Это будет выглядеть примерно так:

# load purr library
library(purrr)

# Map your function
map(c(1:3), function(x) {fun1(df$a, df$b, nrow(df), x)})

Вывод списка:

> map(c(1:3), function(x) {fun1(df$a, df$b, nrow(df), x)})
[[1]]
[1] 2696.223

[[2]]
[1] 2643.748

[[3]]
[1] 2591.273
0 голосов
/ 09 апреля 2019

Вы можете использовать sapply() внутри своей функции

fun1 <- function (a, b, c, d) {    
  sapply(d, function(x) { sum (( a - x ) * b / c ) })
} 

fun1(df$a, df$b, nrow(df), c(1:3)) 
# [1] 2696.223 2643.748 2591.273
...