2013-02-20 37 views
1

我試圖編寫一個函數,它可以在stringr包的幫助下找到名稱中的模式。 我的功能看起來像以下:我無法理解的錯誤。 「Promise已經在評估中......」

namezz=function(thepatternx,data=data,column=Name){ 

    library(stringr) 

    thepattern=as.character(quote(thepatternx)) 

    pattern <- thepattern 
    strings <- data$column ##data$column is a character vector 
    found=str_detect(strings, pattern) 
    yez= rownames(data[which(found==TRUE),]) 
    hhh=as.numeric(yez)+1 
    return(hhh) 

} 

當我調用該函數,我得到一個錯誤:

namezz(Primus) 

Error in namezz(Primus) : 
    promise already under evaluation: recursive default argument reference or earlier problems? 

無法理解的錯誤,什麼我做錯了..在此先感謝任何指引:)

EDIT:如果我寫的,而不是像這樣:

namezz=function(thepatternx,data,Name){ 

    library(stringr) 

    thepattern=as.character(quote(thepatternx)) 

    pattern <- thepattern 
    strings <- data$Name #####data$column is a character vector 
    found=str_detect(strings, pattern) 
    yez= rownames(data[which(found==TRUE),]) 
    hhh=as.numeric(yez)+1 
    return(hhh) 

} 

我得到:

namezz(Primus,data,Name) 

numeric(0) 

這是不正確的,因爲如果我做的程序,而不把它在一個函數,我得到了行:

pattern="Primus" 
strings <- data$Name 
mja=str_detect(strings, pattern) 
yez= rownames(data[which(mja==TRUE),]) 
hhh=as.numeric(yez)+1 

    [1] 2 3 4 5 6 7 8 9 

這裏是一個dput:

dput(head(data)) 
structure(list(Year = 1901:1906, Name = c(">>Primus<< sbk", ">>Primus<< sbk", 
">>Primus<< sbk", ">>Primus<< sbk", ">>Primus<< sbk", ">>Primus<< sbk" 
), Established = c(1899L, 1899L, 1899L, 1899L, 1899L, 1899L), 
    Bolagskod = c(2L, 2L, 2L, 2L, 2L, 2L), Kategori = c(2L, 0L, 
    0L, 0L, 0L, 0L), BranschTillhörighet = c(2L, 2L, 2L, 2L, 
    2L, 2L), Startår = c(1901L, 1901L, 1901L, 1901L, 1901L, 1901L 
    ), Stoppår = c(1908L, 1908L, 1908L, 1908L, 1908L, 1908L), 
    Ranges = c("8 1901 - 1908 >>Primus<< sbk", "8 1901 - 1908 >>Primus<< sbk", 
    "8 1901 - 1908 >>Primus<< sbk", "8 1901 - 1908 >>Primus<< sbk", 
    "8 1901 - 1908 >>Primus<< sbk", "8 1901 - 1908 >>Primus<< sbk" 
    ), Years.present = c("1901 1902 1903 1904 1905 1906 1907 1908", 
    "1901 1902 1903 1904 1905 1906 1907 1908", "1901 1902 1903 1904 1905 1906 1907 1908", 
    "1901 1902 1903 1904 1905 1906 1907 1908", "1901 1902 1903 1904 1905 1906 1907 1908", 
    "1901 1902 1903 1904 1905 1906 1907 1908"), Delägare.män. = c(267L, 
    271L, 317L, 339L, 339L, 345L), Delägare.kvinnor. = c(246L, 
    251L, 236L, 244L, 260L, NA), Sjukdomsfall.män. = c(66L, 61L, 
    100L, 103L, 106L, 82L), Sjukdomsfall.kvinnor. = c(59L, 55L, 
    60L, 71L, 85L, 60L), Sjukdagar.män. = c(1686L, 1918L, 2149L, 
    2212L, 2331L, 1890L), Sjukdagar.kvinnor. = c(1681L, 1197L, 
    1589L, 1904L, 2282L, 1750L), Inkomster.InträdesAvgifter. = c(303L, 
    NA, NA, NA, NA, NA), Inkomster.RegelbundnaAvgifter. = c(4901L, 
    4939L, 5172L, 5687L, 5728L, 5879L), Inkomster.UtdebiteradeAvgifter. = c(1313L, 
    1045L, 1141L, 2024L, 1462L, 1934L), Inkomster.Böter. = c(241L, 
    NA, NA, NA, NA, NA), SummaMedl.avg. = c(6758L, 5984L, 6313L, 
    7711L, 7190L, 7813L), Inkomster.BidragStatKommun. = c(366L, 
    440L, 456L, 464L, 476L, 493L), Inkomster.Räntor. = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_ 
    ), Inkomster.Övrigt. = c(24L, 722L, 874L, 605L, 805L, 647L 
    ), Inkomster.Summa. = c(7148L, 7146L, 7644L, 8781L, 8472L, 
    8954L), DiffIntäkter.SummaMotVerkligSumma. = c(0L, 0L, -1L, 
    -1L, -1L, -1L), Utgifter.Sjukhjälp. = c(4735L, 4450L, 5300L, 
    5870L, 6560L, 5200L), Utgifter.Begravningshjälp. = c(1200L, 
    795L, 1045L, 1810L, 955L, 1675L), Utgifter.Arvoden. = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_ 
    ), Utgifter.Förvaltning. = c(956L, 972L, 1038L, 1156L, 1523L, 
    1171L), Utgifter.Övrigt. = c(25L, NA, 20L, 5L, NA, NA), Utgifter.Behållning. = c(231, 
    929, 240, -59, -565, 908), Utgifter.SummaÖvrigt.Behållning. = c(256L, 
    929L, 260L, -54L, -565L, 908L), Utgifter.Summa. = c(7148L, 
    6217L, 7403L, 8841L, 9038L, 8046L), KOLL = c(-1L, 0L, 0L, 
    0L, 0L, 0L), Tillgångar.KontantIKassa. = c(835L, 1765L, 2006L, 
    1946L, 1380L, 2259L), Tillgångar.KontantMedelBank. = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_ 
    ), Tillgångar.Totalt. = c(836L, 1765L, 2006L, 1946L, 1468L, 
    2348L), Skulder.Totalt. = c(NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_), TillgångarÖverSkulder = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_ 
    )), .Names = c("Year", "Name", "Established", "Bolagskod", 
"Kategori", "BranschTillhörighet", "Startår", "Stoppår", "Ranges", 
"Years.present", "Delägare.män.", "Delägare.kvinnor.", "Sjukdomsfall.män.", 
"Sjukdomsfall.kvinnor.", "Sjukdagar.män.", "Sjukdagar.kvinnor.", 
"Inkomster.InträdesAvgifter.", "Inkomster.RegelbundnaAvgifter.", 
"Inkomster.UtdebiteradeAvgifter.", "Inkomster.Böter.", "SummaMedl.avg.", 
"Inkomster.BidragStatKommun.", "Inkomster.Räntor.", "Inkomster.Övrigt.", 
"Inkomster.Summa.", "DiffIntäkter.SummaMotVerkligSumma.", "Utgifter.Sjukhjälp.", 
"Utgifter.Begravningshjälp.", "Utgifter.Arvoden.", "Utgifter.Förvaltning.", 
"Utgifter.Övrigt.", "Utgifter.Behållning.", "Utgifter.SummaÖvrigt.Behållning.", 
"Utgifter.Summa.", "KOLL", "Tillgångar.KontantIKassa.", "Tillgångar.KontantMedelBank.", 
"Tillgångar.Totalt.", "Skulder.Totalt.", "TillgångarÖverSkulder" 
), row.names = c(NA, 6L), class = "data.frame") 

Edit

此作品:

namezz=function(thepatternx,data,Name){ 

    library(stringr) 

    thepattern=thepatternx 

    pattern <- thepattern 
    strings <- data$Name 
    mja=str_detect(strings, pattern) 
    yez= rownames(data[which(mja==TRUE),]) 
    hhh=as.numeric(yez)+1 
    return(hhh) 

} 

namezz("Primus",data,Name) 
[1] 2 3 4 5 6 7 8 9 

但是,我怎樣才能通過Primus沒有引號,namezz(Primus,data,Name)?考慮一些在我的問題,但as.character(quote())不起作用..

+0

Ok..Dont得到它:/ – user1665355 2013-02-20 14:32:29

+0

@Andrie見我的編輯:) – user1665355 2013-02-20 14:37:07

+0

沒有人有線索?: ) – user1665355 2013-02-20 14:54:20

回答

3

有人可以糾正我這一點,但我認爲你是通過Primus和名稱作爲對象的功能,它正在尋找.GlobalEnv爲那些對象並沒有找到它們,因此你的函數沒有執行你的大部分指令(並且什麼也沒有返回)。我已經編輯了一下你的功能。

相反試試這個...

namezz <- function(pattern = " ", data , column= "Name"){ 
    library(stringr) 
    strings <- data[ , column ] ##data$column is a character vector 
    found = str_detect(strings , pattern) 
    yez = rownames(data[ which(found==TRUE) , ]) 
    hhh = as.numeric(yez) + 1 
    return(hhh) 
} 

然後,你必須使用功能,像這樣:

namezz("Primus" , data = data) #In this case the default for column is "Name" as you want 

與傳遞數據=數據的問題是explained very nicely here。從該職位(他們指testparams你會提到的數據)的摘錄......

"One of the most important things to know about the evaluation of arguments to a function is that supplied arguments and default arguments are treated differently. The supplied arguments to a function are evaluated in the evaluation frame of the calling function. The default arguments to a function are evaluated in the evaluation frame of the function."

the parameter testparams, when no matching argument is passed, is given the default value which is the value of the variable testparams looked-up not in the environment where foo is defined, and not in the environment where foo is called, but rather in the local environment created when the function is called and where parameters are mapped to values -- and in this environment, testparams is a parameter, which is already being under evaluation, hence the recursive lookup error.

+0

謝謝我也管理了。也許我有點不清楚。我想通過不帶引號的'Primus'...任何想法?在問題的最後看到我的編輯。祝你有美好的一天! – user1665355 2013-02-20 15:20:50

+0

請解釋爲什麼你必須通過它沒有引號? AFAIK這是不可能的。 R將在函數的調用框中搜索名爲Primus的對象,除非用引號將其包圍。有些人比我更有經驗和知識,可能會糾正我。 – 2013-02-20 15:22:02

+0

但無論如何,我很滿意你的答案!:) – user1665355 2013-02-20 15:24:54