Я пытаюсь написать функцию, которая находит шаблоны в именах с помощью пакета stringr
. Моя функция выглядит следующим образом:
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(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())
не работает..
data=data
, как объяснено в связанном вопросе. Сначала исправьте это, а затем отлаживайте оставшиеся ошибки в коде. - person Andrie   schedule 20.02.2013data=data
:) - person user1665355   schedule 20.02.2013data[which(found==TRUE),]
эквивалентноdata[found, ]
, и вы должны использоватьdata[found, , drop = FALSE]
, чтобы избежать проблем, если вы передаете фрейм данных с одним столбцом. - person hadley   schedule 21.02.2013which(found) + 1
вместоas.numeric(yez)+1
- person hadley   schedule 21.02.2013