Ошибка, которую я не могу понять. Обещание уже находится на рассмотрении

Я пытаюсь написать функцию, которая находит шаблоны в именах с помощью пакета 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()) не работает..


person user1665355    schedule 20.02.2013    source источник
comment
@Andrie Смотри мое редактирование :)   -  person user1665355    schedule 20.02.2013
comment
У кого-нибудь есть ключ?:)   -  person user1665355    schedule 20.02.2013
comment
Вау. Будьте немного терпеливы и дайте людям возможность взглянуть и посмотреть, могут ли они понять, что происходит! Людям требуется время, чтобы понять проблему и сформулировать достаточно хороший ответ, чтобы заработать эти заслуженные очки репутации!   -  person Simon O'Hanlon    schedule 20.02.2013
comment
Проблема заключается в том, что вы используете data=data, как объяснено в связанном вопросе. Сначала исправьте это, а затем отлаживайте оставшиеся ошибки в коде.   -  person Andrie    schedule 20.02.2013
comment
@Andrie Посмотрите мое редактирование, пожалуйста, где я не использую data=data :)   -  person user1665355    schedule 20.02.2013
comment
К вашему сведению, data[which(found==TRUE),] эквивалентно data[found, ], и вы должны использовать data[found, , drop = FALSE], чтобы избежать проблем, если вы передаете фрейм данных с одним столбцом.   -  person hadley    schedule 21.02.2013
comment
Хотя, может быть, вы действительно хотите which(found) + 1 вместо as.numeric(yez)+1   -  person hadley    schedule 21.02.2013


Ответы (1)


Кто-то может поправить меня в этом, но я думаю, что вы передаете Primus и Name как объекты функции, и она ищет эти объекты в .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

Проблема с передачей данных = данные очень хорошо объяснена здесь. Выдержка из этого поста (где они ссылаются на тестовые параметры, которые вы бы ссылались на данные)...

«Одна из самых важных вещей, которые нужно знать об оценке аргументов функции, заключается в том, что предоставленные аргументы и аргументы по умолчанию обрабатываются по-разному. Предоставленные аргументы функции оцениваются в фрейме оценки вызывающей функции. Аргументы по умолчанию для функция оценивается в кадре оценки функции».

параметру testparams, когда не передан соответствующий аргумент, присваивается значение по умолчанию, которое является значением переменной testparams, искомой not в среде, где определен foo, и not в среде, где вызывается foo, а скорее в локальной среде, созданной при вызове функции и где параметры сопоставляются со значениями — и в этой среде testparams — это параметр, который уже оценивается, поэтому ошибка рекурсивного поиска.

person Simon O'Hanlon    schedule 20.02.2013
comment
спасибо у меня тоже получилось. Возможно, я был немного неясен. Я хочу передать Primus без кавычек... Есть идеи? Смотрите мое редактирование в конце вопроса. Хорошего дня! - person user1665355; 20.02.2013
comment
Пожалуйста, объясните, почему вы должны передать это без кавычек? АФАИК это невозможно. R будет искать объект с именем Primus в вызывающем фрейме функции, если только вы не заключите его в кавычки. Есть люди с большим опытом и знаниями, чем я, которые могут меня поправить. - person Simon O'Hanlon; 20.02.2013
comment
Но в любом случае, я благодарен за ваш ответ! :) - person user1665355; 20.02.2013
comment
Хорошо спасибо! Хороший ответ :) Но мне кажется, я где-то видел пост, где это можно было обойти.. Но я могу ошибаться!! :) - person user1665355; 20.02.2013
comment
Спасибо. Мне теперь интересно узнать, возможно ли это! @hadley может подсказать... - person Simon O'Hanlon; 20.02.2013