强制字符串作为函数内矩阵函数的输入

时间:2016-07-03 19:58:11

标签: r function coercion

编辑:对于任何有兴趣的人,我在这里完成了我的小项目,可以在此链接中看到http://fdrennan.net/pages/myCurve.html 向下滚动到“我认为已经很好地推广”以查看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)

返回10 x 3矩阵,其中一列为1,第二列为x,第三列为平方值。

以下链接将显示曲线拟合的一些不同功能。这篇文章背后的想法是能够写入“x + x ^ 2”或“x + sin(x)”或“e ^ x”等,并返回曲线系数。 http://fdrennan.net/pages/myCurve.html

1 个答案:

答案 0 :(得分:0)

我认为你正在寻找像这样的东西

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

请注意,在您的示例中,您将表达式分开以使用逗号(,)进行评估。因此,我使用逗号将字符串拆分为表达式。如果您尝试传递自己包含逗号的表达式,则会失败。因此,要么限制使用没有逗号的简单表达式。或者,如果这是不可能的,那么使用不同的字符来分隔表达式(如果需要评估该字符,则将其转义)。

但是,我也会在你的问题的评论中重申警告,根据你想要实现的目标,可能有更好的方法