R将值列表分配给对象列表

时间:2016-01-24 09:41:41

标签: r object

感谢您的帮助。我很高兴能够纠正所有R的不端行为。

我不确定我对我之前的帖子完全清楚如下,所以我希望澄清一下:

在R控制台中,我的调用'使用source(etc)'到.R文件 .R文件中的代码使用变量(例如'提取的信息')ex1,ex2,ex3。这些可能包含从文本中提取的字符串或(一串)数字。

根据您的指导,我已将我的功能重命名为'reset'(并且?reset表示没有其他事件发生)在范围内。我正在传递函数外部的x和y:     #send变量ex1,ex2,ex3连同location,loc和parse,prs要重置为0     reset(x&lt; -c(loc,prs,ex1,ex2,ex3),y&lt; -rep(c(0),length(x)))y变量中的#repeats 0与x的条目一样多次< / p>

reset<-function(x,y){
print(c("resetting ",x," with ", y))
if (length(x) == length(y)) {x <- y
    print(paste(x,"=",y),sep="") #both x and y should now be equal (to y)
} else {
    paste("list lengths differ: x=",length(x)," y=",length(y),sep="")
}

}

现在x和y都是0但是ex1,ex2和ex3仍然包含先前的值 我希望ex1,ex2和ex3在用于后续代码段之前都为0,因此它们不会使用以前的值污染提取的数据,如:

loc<-str_locate(data[i],"=")
prs<-str_locate(data[i],",")
#extract data from the end of loc to before the occurrence of prs
ex1<-str_sub(data[i],loc[2]+1,prs[1]-1)
#cleanup
#below is simplified for example;
#in reality I wish to send ex1:ex(n) to be reset with values val1:val(n)

期望的结果是回到Rconsole&gt; ex1现在应该返回0 希望你能理解我的困境并可能有所帮助。

假设我的代码使用一些变量来保存使用Stringr str_sub从字符串中提取的数据。变量是临时的,因为我使用值来构造其他字符串,然后它们应该被释放以用于即将到来的测试:即if(test == true){extract&lt; -str_sub(string,start,end)} < / p>

对于以后的测试,我想提取== 0;很简单,但我有一些,并希望一下子做。

我已经使用了for循环,但如果有更简单的方法,请说明这一点。

我的尝试是使用一个功能:

#For variables loc, prs, ex1 and x2, set all values to 0
x<-assign(x<-c(loc, prs, ex1, ex2),y<-rep(c(0),length(x)))


#Function
assign <- function(x, y) {
    if(length(x)==length(y)){
        for (i in 1:length(x)){x[i]<-y[i]}
        print(c("Assigned",x[i]))
        return (x)
    } else { print (c("list lengths differ: x=",length(x)," y=",length(y)))
    }
}

问题是这会将x返回为0,但变量列表会保留其值。

我对r和SO都是一个小菜,所以尽管我在很多场合都受益于SO的丰富建议,但这是我的第一个问题,所以请保持温和。我已经搜索了这个问题,但现在几个小时内还没找到我需要的东西。希望你能帮忙。

1 个答案:

答案 0 :(得分:0)

注意命名函数assign。在base-r中已经有一个你会产生混乱。

除了名称之外,您的功能还有一些问题。首先,您不需要for-loop将x替换为y,因为这是一个基本的矢量化操作。只需使用x <- y;第二,你应该将你的信息包裹在paste

asgn <- function(x, y) {
  if(length(x)==length(y)){
    ## This step is not needed, return(y) is better as @Rick proposed in their now deleted answer
    ## I am leaving it to show you how the for-loop is not needed
    x<-y
    return (x)
  } else { 
    print (paste("list lengths differ: x=",length(x)," y=",length(y)))
    return(x)
  }
}

然后,您的函数调用存在一些问题。您使用<-而不是=来指定参数。它们只是分配变量的同义词,但函数参数是另一个问题。最后,您尝试使用x是参数(y)中length(x)的定义,但这是不可能的,因为它尚未定义,因此它正在寻找父环境中的x。您应该使用length(3)来测试您的功能。

x<-asgn(x=c(loc, prs, ex1, ex2),y=rep(c(0),length(3)))