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

问题描述:

谢谢您尝试提供帮助。我很乐意纠正所有的R违规行为。R将值列表分配给对象列表

我不知道,我是用我的前面,如下岗位完全清楚,所以我希望澄清:

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

根据您的指导,我已将函数重命名为“重置”(并且“重置”表示没有其他事件)在范围之内。我通过x和y两个函数: #发送变量ex1,ex2,ex3以及位置,loc和解析,prs被重置为0 重置(x < -c(loc,prs,ex1 ,EX2,EX3)中,y < -rep(C(0),长度(X)))在变量y多次#repeats 0作为有对于x

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> EX1现在应该返回0
希望您能理解我的困境,并可能帮助。


说我的代码使用一些变量来保存使用Stringr str_sub从字符串中提取的数据。这些变量是暂时的,因为我使用这些值来构造其他字符串,然后它们应该被释放以用于即将到来的测试中:即,如果(test == true){提取< -str_sub(字符串,开始,结束)}

对于以后的测试,我想提取== 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的丰富建议中受益,但这是我的第一个问题,所以请温和。我已经搜索了这个问题,但现在几个小时内还没有找到我需要的。希望你能帮助。

+0

已经有一个名为“分配”功能。你可能会觉得它很有用,但无论如何你可能不想改变它。 – Rick

当心命名函数assign。 base-r中已经有一个,你会产生混淆。

除了它的名字,你的函数还有一些问题。首先,你不需要用for循环来代替x,因为这是一个基本的向量化操作。只需使用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是在参数(length(x)y的定义,但是这是不可能的,因为它没有定义,所以它正在寻找在父环境X。你应该length(3)而不是测试你的功能。

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