【问题标题】:Coerce a string to be an input into matrix function within a function强制字符串作为函数内矩阵函数的输入
【发布时间】:2016-07-03 19:58:11
【问题描述】:

编辑:对于任何感兴趣的人,我在这里完成了我的小项目,可以在此链接中看到它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

【问题讨论】:

  • 您可能会喜欢purrr::invoke。一般来说,将函数作为字符串处理是一个最好避免的挑剔过程。
  • 你需要的概括是什么概念?如果您需要对“x”参数应用不同的函数,则可以将函数作为参数传递,而不是 parseing 一个“字符”。例如。 expressionInput(func = function(x) x ^ 2, x = 1:10m ncol = 3) 并在您的函数中适当地使用它。通过您的设置,您需要this,但请参阅here
  • 我可以建议您使用公式(例如~1+x+I(x^2))和model.matrix() 函数作为更简单的方法吗?
  • 这个问题的措辞有点含糊。请让我知道我下面的回答是否正确解释了您所追求的内容,我会尝试编辑以使问题更清楚。

标签: r function coercion


【解决方案1】:

我认为您正在寻找类似的东西

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

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

但是,对于您的问题,我也会重申 cmets 中的警告,即根据您要实现的目标,可能有更好的方法来做到这一点。

【讨论】:

  • 你可以向下滚动到它说的地方,“我认为它已经被很好地概括了。”非常感谢您的帮助,感谢您,我找到了我正在寻找的解决方案。我已经自学了 R,我的很多解决方案都来自蛮力。我应该为此努力。无论如何,它现在有效。 fdrennan.net/pages/myCurve.html
  • 抱歉,这是我在这里的第一篇文章。我只是接受了。感谢您的提醒。我还查看了上升趋势,但它说声誉低于 15 的用户已被记录但未公开显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2020-03-19
  • 2019-04-17
  • 2021-01-31
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多