我试图在R周围学习,我需要一些帮助。以下是我正在处理的问题的一小部分样本。
myFunction <- function(price1) {
prices <- c(1:50)
prices[1] <- price1
recursiveA <- vector(length = 51)
recursiveA[1] <- 100
for (i in 1:50) {
recursiveA[i+1] <- 30*prices[i] + recursiveA[i]
}
target <- recursiveA[51]
return(target)
}
我想要做的是创建一个新函数,它将找到产生price1
值所需的target
值。例如,在这个新函数中,我可以将47320
设置为参数,它将返回300
。在第一个函数myFunction
中,值300
返回值47320
。
如何在R中编写函数来执行此操作? R中是否存在现有功能?我看到谷歌搜索并在这个网站上搜索,很多人推荐uniroot()
函数或optimize()
。我无法弄清楚如何将其用于除代数正方形之外的其他东西。
如果有帮助,我知道在excel中我可以通过使用目标搜索工具轻松解决这个问题。您可以设置所需的输出,并从您定义的公式中找到所需的输入。
如果有任何不清楚的地方,请告诉我,我会尽力进一步解释。
非常感谢任何帮助。谢谢。
答案 0 :(得分:5)
你实际上并不需要这里的递归功能。
这是一种矢量化方法:
f <- function(x) tail(cumsum(c(100, 30*c(x, 2:50))), 1)
f(123)
# 42010
并扭转操作:
anti_f <- function(x) (x - 30*50*51/2 + 30 - 100)/30
anti_f(42010)
# 123
当然,当你做需要递归时,这没什么用处。我的观点是,你应该尽可能寻找机会进行矢量化。
如果您想使用optimise
执行此操作,则可以执行以下操作:
f <- function(x) abs(myFunction(x) - 42010)
optimize(f, lower=-1000, upper=1000)
# $minimum
# [1] 123
#
# $objective
# [1] 2.512278e-05
R将搜索[-1000,1000]以尝试查找最小化x
绝对值的值myFunction(x) - 42010
。在这种情况下,它会找到123
,myFunction(123)
会返回42010
,因此abs(myFunction(x) - 42010)
会返回0
。
如果你想将它包装在一个函数中,你可以这样做:
unfunction <- function(x, lower, upper) {
optimize(function(y) abs(myFunction(y) - x), lower=lower, upper=upper)
}
unfunction(42010, -1000, 1000)
# $minimum
# [1] 123
#
# $objective
# [1] 2.512278e-05
unfunction(47320, -1000, 1000)
# $minimum
# [1] 300
#
# $objective
# [1] 0.0002383182
在我们的函数unfunction
中,lower
和upper
指定要搜索的空间。