Я написал функцию и пытаюсь передать ее через lapply для запуска каждой строки в фрейме данных - PullRequest
0 голосов
/ 05 июня 2019

Мой код ниже

    myfunction = function (D)
{

  if( unique( commonData[ , FLAG] ) == "Yes" )
  {
    D[,'YD_Yes'][rownum ] <- commonData[commonData[ , FLAG ] == "Yes", "STRS" ] ;
    D[,'PD_Yes'][ rownum ] <- commonData[ commonData[ , FLAG ] == "Yes", "VAL" ];
  }  else if (unique(commonData[, FLAG]) == "No")
  {
    D[,'YD_Pure_Wasted'][[ rownum ]] <- commonData[commonData[ , FLAG ] == "Pure_No", "STRS" ] ;
    D[,'PD_Pure_Wasted'][[ rownum ]] <- commonData[commonData[ , FLAG ] == "Pure_No", "VAL" ] ;
  } else {
   D[,'YD_Repeated_Wasted'][[ rownum ]] <- commonData[commonData[ , FLAG ] == "Repeated_No", "STRS" ] ;
   D[,'PD_Repeated_Wasted'][[ rownum ]] <- commonData[commonData[ , FLAG ] == "Repeated_No", "VAL" ] ;
   }

    temp = lapply(myfunction, mydataframe)

Я ожидаю выполнения вычисления в функции.Однако сообщение об ошибке:

Error in `[.default`(`*tmp*`, "YD_Yes") : 
  incorrect number of dimensions

1 Ответ

0 голосов
/ 05 июня 2019

Во-первых, добро пожаловать в SO.

Теперь о вашем вопросе: как сказал Рохит, «я рад, что это неправильный подход к вашей проблеме». Вместо этого вы должны использовать apply.

Но в вашем коде есть еще одна проблема (не совсем проблема, а неприятный запах кода), это переменные, которые вы используете в своей функции: rownum, commonData и FLAG. Они находятся вне области видимости, и их сложно отследить.

Итак, сначала объявите их в своей функции:

myFunction = function(D, rownum, commonData, FLAG) {
    # your function code
}

И их использование применяется для итерации каждой строки в «myFunction»:

apply(D, 1, rownum, commonData, FLAG)

Первый применяемый параметр - это данные, подлежащие итерации (аргумент первой функции), а последние 3 параметра - остальные аргументы функции.

Но помните: прежде чем задать вопрос, попробуйте создать воспроизводимый пример, чтобы мы могли помочь вам быстрее.

...