我正在尝试学习有关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)
}
Run Code Online (Sandbox Code Playgroud)
我想做的是创建一个新函数,该函数将查找产生price1值所需的target值。例如,在这个新函数中,我将能够设置47320为参数并将其返回300。在第一个函数中myFunction,的值300返回的值47320。
如何在R中编写一个函数来做到这一点?R中是否存在现有功能?通过我的Google搜索和在该网站上的搜索,我发现很多人推荐此uniroot()功能或optimize()。我无法弄清楚如何将其用于除代数二次方之外的其他内容。
如果有帮助,我知道在excel中,我可以使用目标搜索工具轻松解决此问题。您可以设置所需的输出,并从您定义的公式中找到所需的输入。
如果有任何不清楚的地方,请告诉我,我将尽力进一步解释。
任何帮助深表感谢。谢谢。
您实际上在这里不需要递归函数。
这是一种向量化方法:
f <- function(x) tail(cumsum(c(100, 30*c(x, 2:50))), 1)
f(123)
# 42010
Run Code Online (Sandbox Code Playgroud)
并反转操作:
anti_f <- function(x) (x - 30*50*51/2 + 30 - 100)/30
anti_f(42010)
# 123
Run Code Online (Sandbox Code Playgroud)
当然,这是不太有用的,当你真正做需要递归。我的意思是,您应该在可能的情况下寻找矢量化的机会。
如果您想使用进行此操作optimise,则可以执行以下操作:
f <- function(x) abs(myFunction(x) - 42010)
optimize(f, lower=-1000, upper=1000)
# $minimum
# [1] 123
#
# $objective
# [1] 2.512278e-05
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在我们的函数中unfunction,lower并upper指定要搜索的空间。