强制将字符串作为函数内矩阵函数的输入
Coerce a string to be an input into matrix function within a function
编辑:对于任何感兴趣的人,我在这里完成了我的小项目,可以在这里看到 link http://fdrennan.net/pages/myCurve.html
向下滚动到 "I think it's been generalized decently" 以查看 curve_fitter 函数。如果你觉得它有用,就把它偷走,我不需要信用。我仍然有 ncol 作为输入,但不再需要它了。我只是没有删除它。
我正在编写一个脚本,它将为我做一些最小二乘的事情。我将使用它来拟合曲线,但想概括它。我希望能够在函数中写入 "x, x^2" 并将其粘贴到矩阵函数中并读取。这就是我所说的。
expressionInput <- function(func = "A written function", x = "someData",
nCol = "ncol") {
# Should I coerce the sting to something in order to make...
func <- as.SOMETHING?(func)
# ...this line to be equivalent to ...
A <- matrix(c(rep(1, length(x)), func), ncol = nCol)
# .... this line
# A <- matrix(c(rep(1, length(x)), x, x^2), ncol = 3)
A
}
expressionInput(func = "x, x^2", x = 1:10, nCol = 3)
Returns 10 x 3 矩阵,第一列为 1,第二列为 x,第三列为平方值。
下面的link将展示几个不同的曲线拟合函数。这个 post 背后的想法是能够在 "x + x^2" 或 "x + sin(x)" 或 "e^x" 等中写入,并且 return 曲线的系数。
http://fdrennan.net/pages/myCurve.html
我想你正在寻找这样的东西
f <- function(expr="", x=NULL, nCol=3) {
expr <- unlist(strsplit(expr,","))
ex <- rep("rep(1,length(x))", nCol)
ex[1:length(expr)] <- expr
sapply(1:length(ex), function(i) eval(parse(text=ex[i])))
}
f("x, x^2", 1:10, 3)
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 4 1
[3,] 3 9 1
[4,] 4 16 1
[5,] 5 25 1
[6,] 6 36 1
[7,] 7 49 1
[8,] 8 64 1
[9,] 9 81 1
[10,] 10 100 1
请注意,在您的示例中,您使用逗号 (,
) 分隔要计算的表达式。因此,我使用逗号将字符串拆分为表达式。如果您尝试传递本身包含逗号的表达式,这将失败。因此,要么限制使用不带逗号的简单表达式。或者,如果这不可能,则使用不同的字符来分隔表达式(如果需要评估该字符,则将其转义)。
但是,我也会重申评论中的警告,根据您想要实现的目标,可能有更好的方法 去做。
编辑:对于任何感兴趣的人,我在这里完成了我的小项目,可以在这里看到 link http://fdrennan.net/pages/myCurve.html 向下滚动到 "I think it's been generalized decently" 以查看 curve_fitter 函数。如果你觉得它有用,就把它偷走,我不需要信用。我仍然有 ncol 作为输入,但不再需要它了。我只是没有删除它。
我正在编写一个脚本,它将为我做一些最小二乘的事情。我将使用它来拟合曲线,但想概括它。我希望能够在函数中写入 "x, x^2" 并将其粘贴到矩阵函数中并读取。这就是我所说的。
expressionInput <- function(func = "A written function", x = "someData",
nCol = "ncol") {
# Should I coerce the sting to something in order to make...
func <- as.SOMETHING?(func)
# ...this line to be equivalent to ...
A <- matrix(c(rep(1, length(x)), func), ncol = nCol)
# .... this line
# A <- matrix(c(rep(1, length(x)), x, x^2), ncol = 3)
A
}
expressionInput(func = "x, x^2", x = 1:10, nCol = 3)
Returns 10 x 3 矩阵,第一列为 1,第二列为 x,第三列为平方值。
下面的link将展示几个不同的曲线拟合函数。这个 post 背后的想法是能够在 "x + x^2" 或 "x + sin(x)" 或 "e^x" 等中写入,并且 return 曲线的系数。 http://fdrennan.net/pages/myCurve.html
我想你正在寻找这样的东西
f <- function(expr="", x=NULL, nCol=3) {
expr <- unlist(strsplit(expr,","))
ex <- rep("rep(1,length(x))", nCol)
ex[1:length(expr)] <- expr
sapply(1:length(ex), function(i) eval(parse(text=ex[i])))
}
f("x, x^2", 1:10, 3)
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 4 1
[3,] 3 9 1
[4,] 4 16 1
[5,] 5 25 1
[6,] 6 36 1
[7,] 7 49 1
[8,] 8 64 1
[9,] 9 81 1
[10,] 10 100 1
请注意,在您的示例中,您使用逗号 (,
) 分隔要计算的表达式。因此,我使用逗号将字符串拆分为表达式。如果您尝试传递本身包含逗号的表达式,这将失败。因此,要么限制使用不带逗号的简单表达式。或者,如果这不可能,则使用不同的字符来分隔表达式(如果需要评估该字符,则将其转义)。
但是,我也会重申评论中的警告,根据您想要实现的目标,可能有更好的方法 去做。