К сожалению, C ++ lambdas могут захватывать по ссылке, но не решают проблему « вверх по funarg ».
Для этого потребуется выделить захваченные локали в ячейках и сборку мусора или подсчет ссылок для освобождения. C ++ не делает этого, и, к сожалению, это делает C ++ lambdas намного менее полезным и более опасным, чем на других языках, таких как Lisp, Python или Javascript.
Более конкретно, в моем опыте вам следует избегать во что бы то ни стало скрытого захвата (т. е. используя форму [&](…){…}
) для лямбда-объектов, которые выживают в локальной области, потому что это рецепт случайных segfaults позже во время обслуживания.
Всегда тщательно планируйте, что делать, а также о том, как и как захваченные ссылки.
Конечно, безопасно записывать все по ссылке с помощью [&]
, если все, что вы делаете, это просто использовать лямбда в той же области, чтобы передавать код, например, таким алгоритмам, как std::sort
, не имея для определения именованной функции компаратора вне функции.
Подход, который может работать иногда, записывается по значению a shared_ptr
в состояние, выделенное кучей. Это в основном реализует вручную то, что делает Python автоматически (но обратите внимание на циклы ссылок, чтобы избежать утечек памяти: у Python есть сборщик мусора, C ++ - нет).
Мы можем использовать регулярное выражение для соответствия шаблону для фильтрации строк
subset(df1, grepl("^02:01", V21.X2))
# V21.X1 V21.X2
#1 A 02:01:03
#2 A 02:01:04
Или извлечь с помощью substr
, а затем выполнить ==
subset(df1, substr(V21.X2, 1, 5)=='02:01')
# V21.X1 V21.X2
#1 A 02:01:03
#2 A 02:01:04
Если набор данных является столбцом matrix
, существует только столбец sngle, то есть «V21», который сохраняет matrix
с двумя столбцами «X1» и «X2»
m1 <- cbind(X1 = "A", X2 = c("02:01:03", "02:01:04", "03:01:05", "03:01:04"))
df1 <- data.frame(V21 = rep(NA, 4))
df1$V21 <- m1
subset(df1, grepl("^02:01", V21.X2))
Ошибка в grepl ("^ 02:01", V21.X2): объект 'V21.X2' не найден
blockquote>Решение состояло в том, чтобы преобразовать столбцы в обычные столбцы в поле
data.frame
и выполните данныеsubset
df2 <- do.call(data.frame, df1) subset(df2, grepl("^02:01", V21.X2)) # V21.X1 V21.X2 #1 A 02:01:03 #2 A 02:01:04
df1 <- structure(list(V21.X1 = c("A", "A", "A", "A"), V21.X2 = c("02:01:03", "02:01:04", "03:01:05", "03:01:04")), .Names = c("V21.X1", "V21.X2" ), class = "data.frame", row.names = c(NA, -4L))
str
набора данных. Я думаю, что этоmatrix
с одной колонкой – akrun 13 July 2018 в 16:16