Rstudio - 用户创建的函数出错 - 找不到对象

时间:2014-06-11 13:19:24

标签: r function

第一件事是第一件事;我在R中的技能有些缺乏,所以我有可能在下面使用不正确的东西。如果我在某处出错,请告诉我。

我在Rstudio中遇到了一个问题,我尝试为公式创建2个函数,然后使用nls()创建一个使用它们的模型,我将用它来创建一个图。当我尝试运行该行来创建它时,我收到一条错误消息,指出缺少一个对象。它始终是第一个“公式”函数中的最后一个对象,在本例中为“p”。

我将在这里提供我的代码然后解释我想要为一些小环境做些什么;

DATA <- read.csv(file.choose(), as.is=T)

formula <- function(m, h, g, p){(2*m)/(m+(sqrt(m^2+1)))*p*g*(h^2/2)}
formula.2 <- function(P, V, g){P*V*g}

m = 0.85
p = 766.42
g = 9.81
P = 0.962
h = DATA$lithothick
V = DATA$Vol

fit.1 <- nls(formula (P, V, g) ~ formula(m, h, g, p), data = DATA)

如果我运行它如何显示,我得到错误;

Error in (2 * m)/(m + (sqrt(m^2 + 1))) * p : 'p' is missing

然而,如果我将公式中的对象重新排列为(m,g,p,h),它将显示h

Error in h^2 : 'h' is missing

现在,我要做的就是这个;我的.csv文件有3个厚度(0.002,0.004,0.006米)和3个体积(10,25,50毫升)。我试图看到随着每个物体(分别)的厚度和体积的增加,强度和浮力的比率(相对于彼此)如何增加。我希望能够得到一个图表,显示每个属性的上升趋势(强度和浮力),因为我认为它们是不相等的(一个指数是另一个线性)。我希望这不会比澄清更令人困惑,但任何指针都会非常受欢迎。

1 个答案:

答案 0 :(得分:0)

你不能在R中以这种方式重载函数,你可以做的是提供语法为function(mandatory, optionnal="")的可选参数(这是一种重载)

如果您想使用3参数公式,那么您必须使用formula.2

解决方法可能是使用一个带有一个optionnal参数的函数,并检查是否已使用此参数。类似的东西:

formula = function(m, h, g, p="") {
  if (is.numeric(p)) {
    (2*m)/(m+(sqrt(m^2+1)))*p*g*(h^2/2)
  } else {
   m*h*g
  }
}

这很丑陋,这是一个非常糟糕的方法(你的变量并不意味着从一个调用到另一个调用的东西相同)但是它有效。