我想运行一个函数并提取函数中对象的输出。我期望的输出是一个包含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