【问题标题】:Writing R function with if enviornment使用 if 环境编写 R 函数
【发布时间】:2013-11-19 09:24:18
【问题描述】:

我正在尝试编写一个根据第二个参数执行不同操作的函数。但我一直收到错误。根据矩阵的维度,函数应该执行不同的任务。这是一个例子

x<-cbind(X1,X2,X3)

function<-function(x,hnrstr){
  if (hnrstr<-1){ 
    x<-data.frame(X1=x[1],X2=x[2],X3=x[3])
    y<-x 
    y[ ,"X2","X3"]<- gsub(" {2, }"," ",y[ ,"X2","X3"])       
  }

  if (hnrstr<-2){ 
    x<-data.frame(X1=x[1],X2=x[2])
    P<-x 
  }  
  if (hnrstr<-1){
    x<-y
  }
  if (hnrstr<-2){
    x<-P  
  }
  return(x)
}

apply(x,c(3,3), function(x,1))

我收到错误:

Error in drop && !has.j : invalid 'x' type in 'x && y'

【问题讨论】:

  • 您能否在运算符周围添加一些空格,以便我们知道您是否/何时使用小于符号&lt;,以及何时使用赋值运算符&lt;-?另外,对于这类问题,我一般也会考虑switch作为替代方案。
  • 我认为在你的 if 语句中,测试应该是例如如果 (hnrstr==2),而不是 (hnrstr
  • 我放入了交换机操作员。 switch(hnrstr, "1"={ .....}, "2"={....}) 但对于 apply(x,1,strassestand(x,"1")) 仍然是同样的错误
  • apply 语句应该是apply(x, 1, strassestand, hnrstr=1)

标签: r function gsub


【解决方案1】:

hnrstr&lt;-1 将值 1 分配给 hnrstr。您不希望在 if 语句中出现这种情况。您的意思是“测试 hnrstr 小于负一”,在这种情况下添加一些空格。 hnrstr &lt; -1,或者你的意思是“测试 hnrstr 是否等于一”,在这种情况下使用双等号,hnsstr == 1


如果X1X2X3 是向量,那么x 将是一个矩阵。也就是说,它有两个维度。这意味着稍后,在您分配y &lt;- x 之后(为什么需要这样做?)y[ ,"X2","X3"]) 没有多大意义,因为它意味着有 3 个维度,而不是两个维度。这就是导致错误的原因。你是说y[, c("X2","X3")])吗?


gsub 接受一个向量,因此在您更改了之前的代码之后,您还需要更改对该函数的调用。您想将第二列或第三列或两者都传递给它(一个接一个)?


第二个 if 块看起来毫无意义。想一想如何删除它们。

if (hnrstr<-1){
x<-y
}
if (hnrstr<-2){
x<-P  
}

您不需要在函数末尾添加return 语句。 R 自动返回函数中计算的最后一个值。


正如 Colin 所说,不要尝试将您的函数称为“函数”。那只是自找麻烦。换行

function <- function(x,hnrstr){

【讨论】:

  • 问题是,我想用 gesub 从字符串中删除空格如果我使用x[ ,c("X2","X3")]&lt;- gsub(" {2, }"," ",x[ ,c("X2","X3")]) R 只是用 1 覆盖 X2 和 X3,如果我只在单个向量上使用 gsub,它就可以正常工作.
  • 我想在数据帧的两个向量上使用 gsub。我需要 X1 将一些 if 命令放在一些 gsub 命令上。
  • 您可能还想提及:function &lt;- function ;)
  • @user2963882 您可以使用循环应用gsubfor 循环,或使用lapply 函数)。在你这样做之前,我建议你练习一下索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多