Используйте lapply для увеличения переменной в r - PullRequest
0 голосов
/ 27 мая 2018

Можно ли увеличить переменную с помощью lapply.Для приведенного ниже примера, как мне это сделать, если мне нужен данный вывод.или я за два цикла для таких проблем?как лучше?

 loop = 1
    string1 = "Now reading book"
    words = c("alpha","beta","gamma")

    all.words <- lapply(words,sampleFunc)

    sampFunc <- function(i,x=string1){

    temp <- paste(loop,x,i,sep="")

    }

    Ideal output
    1 Now reading book alpha
    2 Now reading book beta
    3 Now reading book gamma


    Actual output
    1 Now reading book alpha
    1 Now reading book beta
    1 Now reading book gamma

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Вы можете перебрать номер элемента (1:length(words)), а затем получить соответствующий элемент для этого элемента (words[i]):

string1 = "Now reading book"
words = c("alpha","beta","gamma")
lapply(1:length(words), function(i) paste(i,string1,words[i]))
0 голосов
/ 27 мая 2018

На самом деле, lapply() является избыточным для этой задачи.

string1 = "Now reading book"
words = c("alpha","beta","gamma")

Простой paste() может уже делать то, что вы хотите:

paste(1:length(words), string1, words) # sep = " " is default

[1] "1 Now reading book alpha" 
[2] "2 Now reading book beta" 
[3] "3 Now reading book gamma"

Примечание: string1является вектором длины 1, тогда как первый числовой вектор и words являются векторами длины 3. Во многих функциях в R происходит то, что R умножает / повторяет более короткий вектор, циклически повторяя его содержимое снова и снова.В этом случае циклический переход по единственной строке «Сейчас читаем книгу» повторяется 3 раза.Это типичный способ решения таких ситуаций.Исходя из другого языка, это поведение удивительно.(Python просто выдаст ошибку и остановит выполнение в такой ситуации или срежет другие два с некоторым предупреждением).С этим, иногда удивительным, а иногда и очень неожиданным поведением R иногда бывает так трудно справиться.

Просто помните о концепции cycling.

sep = <delimiter> находится между содержаниемкаждый из векторов, которые ставятся из стороны в сторону.Каким-то образом, благодаря такому «соединительному» поведению, можно подумать, что paste() является join() заменой.Но это на самом деле не плоский нормальный join().Он «соединяет» вещи параллельно (как вы видите в примере, первые элементы заданных векторов рядом, вторые элементы рядом и т. Д.)

Однако paste0( , collapse=""), которыйсинтаксический сахар для paste( , sep="", collapse="") ведет себя немного как join() в Python ... (при применении к векторам R, но не применительно к спискам).

l <- list("a", "b", "c")
paste0(l)
## [1] "a" "b" "c"
v <- c("a", "b", "c")
paste0(v)
## [1] "a" "b" "c"
paste0(v, collapse="")
## [1] "abc"
paste0(l, collapse="")
## [1] "abc"

# so paste0(, collapse="") or paste(  , sep = "", collapse = "")
# applied on single vector or list behaves like python's join with separator as "" (which argument is ONE python list.
0 голосов
/ 27 мая 2018

paste векторизовано.Вам не нужна петля.Просто используйте paste для объединения string1 с words как:

string1 = "Now reading book"
words = c("alpha","beta","gamma")

# Now apply paste
paste(string1, words)
# [1] "Now reading book alpha"
# [2] "Now reading book beta" 
# [3] "Now reading book gamma"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...