Некоторые играют в data.table
и повторно используют свою существующую substr()
логику:
library(data.table)
setDT(testdata)
cols <- paste0("v", 11:13)
new_cols <- paste0(rep(cols, 2), rep(c("a", "b"), each = length(cols)))
extra <- function(x) substr(x, 1, 4)
extrb <- function(x) substr(x, 5, 8)
testdata[, (new_cols) := c(lapply(.SD, extra), lapply(.SD, extrb)), .SDcols = cols]
> testdata
v11 v12 v13 v11a v12a v13a v11b v12b v13b
1: 00240031 00000000 00310064 0024 0000 0031 0031 0000 0064
2: 00310028 00000000 00180058 0031 0000 0018 0028 0000 0058
Я думаю, что можно запустить программу с набором LD_DEBUG для наблюдения точного порядка:
LD_DEBUG=all <myprogram>
Править: Если Вы смотрите на исходный код компоновщика во время выполнения (glibc 2.7), конкретно в файлах:
Вы будете видеть, что argc, argv и окружают (псевдоним для __
окружите), установлены, прежде чем любых глобальных конструкторов вызывают (функции init). Можно следовать за выполнением стартовое право от _start, фактическая точка входа (запустить. S). Поскольку Вы заключили Stevens в кавычки "Массив строк, названный средой, сделан доступным, когда процесс начинается", предполагая, что присвоение среды происходит в самом начале инициализации процесса. Поддержанный кодом компоновщика, который делает то же, должен дать Вам достаточное душевное спокойствие :-)
РЕДАКТИРОВАНИЕ 2: Также стоящий упоминания, это окружает, установлен достаточно рано, что даже компоновщик во время выполнения может запросить его, чтобы определить, произвести ли verbosely (LD_DEBUG).
По моему опыту, библиотека времени выполнения C инициализируется, прежде чем время выполнения вызывает инициализаторы Ваших статических переменных (и таким образом, Ваши инициализаторы могут назвать библиотечные функции времени выполнения C).
Учитывая, что и установка среды и вызов статических инициализаторов являются функциями, которые должно выполнить время выполнения языка, прежде основной () вызывается, я не уверен, что Вы найдете гарантию здесь. Таким образом, я не знаю о конкретном требовании здесь, что это должно работать и что порядок гарантируется до основного () на, скажем, языке ANSI и спецификациях библиотеки или чем-либо...., но я не проверял для проверки также.
В то же время я не знаю о конкретном требовании, которое ограничивает, какие функции библиотеки времени выполнения могут быть вызваны от статического инициализатора. И, главное, было бы похоже на ошибку во время выполнения (мне), если Вы не могли бы получить доступ к среде от одной.
На этой основе я голосую за то, что ожидал бы, что это будет работать, безопасное предположение, и текущие точки данных, кажется, поддерживают эту цепь рассуждений.