Size: a a a

R (язык программирования)

2021 June 10

BA

Bogdan Avramenko in R (язык программирования)
Через внутренний df функции
источник

IS

Ilya Shutov in R (язык программирования)
Неа. ff(df$a, df$b) должно формироваться программным образом. Есть только df с произвольным составом колонок.
источник

IS

Ilya Shutov in R (язык программирования)
я бы даже более жесткий вариант поставил:
ff <- function(x, ...){}
# надо
ff(x = 5, df$a, df$b, df$c)
источник

PD

Pavel Demin in R (язык программирования)
а известно, что только три вектора значений будет всегда?
источник

IS

Ilya Shutov in R (язык программирования)
100% известно, что их значение произвольно и отдается на откуп пользователю
источник

AP

Aleksandr Pidtykan in R (язык программирования)
А что не так с примитивным методом ?
источник

IS

Ilya Shutov in R (язык программирования)
задача совсем по другому стоит
источник

PD

Pavel Demin in R (язык программирования)
в общем, мое решение явно для вас интересным не будет, но раз уж влез, надо что-то написать)

# create random situation
df <- as.data.frame(matrix(data = rnorm(100), ncol = 10))
names(df) <- c('A', sample(LETTERS[2:length(LETTERS)], 9, FALSE))

# user selects columns
my_cols <- c("A", # obligatory, known apriori
            names(df)[names(df) > 'M'] # some logic to choose cols
)

# example of a function with arbitrary args
do.call(
   cbind,
   df[, my_cols]
)
источник

BA

Bogdan Avramenko in R (язык программирования)
Ок, третья попытка.

df <- data.frame(a = 1:4, b = 5:8, c = 9:12)

ff <- function(df.name = 'df', colnames)
{
 df2 <- get(df.name)
 
 cur_columns <- paste0("c('", glue_collapse(colnames, "', '"), "')")
 
 tmp <- df2[, eval(parse(text=cur_columns))]
 
 return(tmp)
}

# Произвольный список колонок
col_list <- c('b', 'c')

ff(df.name = 'df', colnames = col_list)

ff(df.name = 'df', colnames = c('c'))

ff(df.name = 'df', colnames = c('c', 'a'))

ff(df.name = 'df', colnames = c('c', 'a', 'b'))
источник

IS

Ilya Shutov in R (язык программирования)
отчасти похоже на то, что у меня есть в черновиках
источник

AP

Aleksandr Pidtykan in R (язык программирования)
Я вообще понять не могу что надо )
источник

BA

Bogdan Avramenko in R (язык программирования)
Я тоже до конца не понимаю, что ожидается на входе и что на выходе.
источник

BA

Bogdan Avramenko in R (язык программирования)
Вот, в конфигах указываем любые имена столбцов, только их и используем
источник

IS

Ilya Shutov in R (язык программирования)
давайте тогда с ответа. меня интересуют иные альтернативы, поскольку в настоящем коде не все так тривиально и еще бубны требуются.

Имеем функцию ff(x, ...), которая принимает опциональные параметры через ...
Хочу передать колонки data.frame в виде отдельных параметров.

df <- data.frame(a = 1:4, b = 5:8, c = 9:12)

Т.е. хочется программным образом получить вызов ff(x, df$a, df$b, df$c).
Как можно сделать?

df <- data.frame(a = 1:4, b = 5:8, c = 9:12)

# хочется получить вызов ff(df$a, df$b, df$c)

ff <- function(x, ...){
 dots1 <- list(...)
 dots2 <- rlang::list2(...)
 identical(dots1, dots2)

 browser()
}

# для комбинаций явных и неявных параметров делаем repack для подхвата значений в `...`
# вариант 1
do.call("ff", c(x = 2, df))
# вариант 2
rlang::exec("ff", x = 2, !!!df)
источник

AP

Aleksandr Pidtykan in R (язык программирования)
А чем это отличается от вашего варианта ???
setDT(df)

df[, ..col_list]
источник

Я

Ярік in R (язык программирования)
Помогите, пожалуйста. Не могу понять что случилось с Rstudio. У мене перестали нормально отображаться русские буквы. Пробовал нажимать "reopen with encoding". Ни одна кодировка не помогает.
источник

AS

Alexander Semenov in R (язык программирования)
Какая версия R?
источник

A

Andrey in R (язык программирования)
Это читерский способ:) Там уже готовая функция без dt задействована. И у этой функции такой неудобный интерфейс
источник

ГД

Григорий Демин... in R (язык программирования)
Идиоматический R способ - через do.call, как в вашем первом варианте. А что с ним не работает?
источник

IS

Ilya Shutov in R (язык программирования)
в  реальности функция ff(...) сложная, кроме ... есть еще масса обязательных параметров, которые имеют разные типы и надо конструировать различным образом.
источник