当使用mapply在R中运行函数时,我观察到的输出并不是我所期望的



我想运行一个函数并提取函数中对象的输出。我期望的输出是一个包含5行5列的数据帧。相反,我获得了一个1000行5列。

以下是具有可复制示例的代码:

input.rows3 <- data.frame(pd=c(38, 50, 50, 86, 38),
Cl=c(15, 40, 30, 81, 15),
va=c(150, 145, 160, 141, 150),
co=c(3.0, 4.5, 4.0, 4.8, 1.5))
P <- c(seq(0,184,length.out=1000))
deriv.model <- function(a,b,c,x){
(a*exp(-((((exp(b)*x))/1000))+c+b))/1000
}
marg.N.resp.function3 <- function(va, co, pd, Cl, P){
a <-  10000  + 20*Cl
b <- 2
c <- (-0.05*pd)
pr <- co / (va/1000)
optimalP <- as.data.frame(deriv.model(a,b,c,P)) %>% 
rename(optimalP = "deriv.model(a, b, c, P)") %>% 
mutate(diff=abs(optimalP - pr))
resultP <-cbind(optimalP,P) %>%
slice(which.min(diff)) %>% 
select(P)
newlist <- list(a, b, c, pr, resultP)
return(newlist)
}
results3 <- as.data.frame(t(mapply(marg.N.resp.function3, 
input.rows3$va, 
input.rows3$co, 
input.rows3$pd,
input.rows3$Cl,
P))) 
results3

我的理解是results3对象的最后一列应该是来自resultP的单个值。然而,看起来我得到了作为输入的整个P向量(输出的最后一列(。我可能对(m(application函数做了一些不太熟悉的错误操作。

任何提示都将不胜感激。

谢谢。

通过将p作为参数传递给mapply,您正在对其进行迭代并回收较短的变量。有两种方法可以解决这一问题,具体取决于您计划如何使用它,您可以从参数列表和对mapply的调用中删除P,也可以创建一个列表,在每次迭代中重复P一次。

第一种方法,通过从参数列表中删除"p"来更改函数定义:

library(tidyverse) # for %>%
marg.N.resp.function4 <- function(va, co, pd, Cl){
a <-  10000  + 20*Cl
b <- 2
c <- (-0.05*pd)
pr <- co / (va/1000)
optimalP <- as.data.frame(deriv.model(a,b,c,P)) %>% 
rename(optimalP = "deriv.model(a, b, c, P)") %>% 
mutate(diff=abs(optimalP - pr))
resultP <-cbind(optimalP,P) %>%
slice(which.min(diff)) %>% 
select(P)
newlist <- list(a, b, c, pr, resultP)
return(newlist)
}

results4 <- as.data.frame(t(mapply(marg.N.resp.function4, 
input.rows3$va, 
input.rows3$co, 
input.rows3$pd,
input.rows3$Cl 
))) 
results4
# V1 V2   V3       V4      V5
# 1 10300  2 -1.9       20       0
# 2 10800  2 -2.5 31.03448       0
# 3 10600  2 -2.5       25       0
# 4 11620  2 -4.3 34.04255       0
# 5 10300  2 -1.9       10 17.4975

这种方法依赖于在函数之外定义p。如果使用不同的P向量进行调用,则每次运行之前都需要在函数外部重新分配P。

第二种方法更通用,允许您在不同的运行中使用其他向量来表示p。

results3 <- as.data.frame(t(mapply(marg.N.resp.function3, 
input.rows3$va, 
input.rows3$co, 
input.rows3$pd,
input.rows3$Cl,
list(rep(P, times = 5))
))) 
results3
# V1 V2   V3       V4      V5
# 1 10300  2 -1.9       20       0
# 2 10800  2 -2.5 31.03448       0
# 3 10600  2 -2.5       25       0
# 4 11620  2 -4.3 34.04255       0
# 5 10300  2 -1.9       10 17.4975
identical(results4, results3)
# [1] TRUE

相关内容

最新更新