2016-01-24 65 views
0

謝謝您嘗試提供幫助。我很樂意糾正所有的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

回答

0

當心命名函數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)))