Вы можете сделать это в базе, используя код
# Identify cases which match 9 digits then one letter
CRMMatch <- grepl("^\\d{9}[[:alpha:]]$", as.character(x$HospitalNumber))
#Create columns from Hospital number among the matches or those that do not match
x$CRN[CRMMatch] <- as.character(x$HospitalNumber)[CRMMatch]
x$TIT[!CRMMatch] <- as.character(x$HospitalNumber)[!CRMMatch]
# clean up by removing the variable created of matches
rm(CRMMatch)
A dplyr
версия может быть
library(dplyr)
x <-
x %>%
mutate(CRN = if_else(grepl("^\\d{9}[[:alpha:]]$", as.character(HospitalNumber)),as.character(HospitalNumber), NA_character_),
TIT = if_else(!grepl("^\\d{9}[[:alpha:]]$", as.character(HospitalNumber)),as.character(HospitalNumber), NA_character_))
Обычный путь, используйте #ifdef и #define в Ваших заголовочных файлах
внутри game.h:
#ifndef GAME_H
#define GAME_H
.. rest of your header file here
#endif
Таким образом, содержание будет считано многократно, но только определено однажды.
Править: Удаленные символы нижнего подчеркивания в запуске и конце идентификатора на комментарии.
Ключ является предописанием. Возьмите материал от game.h
это требуется в socket.h
(или наоборот), и вперед - объявляют это в еще одном заголовке, например. game_forwards.h
. Как пример, рассмотрите следующее:
// game_fwd.h
#ifndef GAME_FWD_H
#define GAME_FWD_H
class game;
#endif // ndef GAME_FWD_H
// game.h
#ifndef GAME_H
#define GAME_H
#include "socket.h"
class game {
socket* m_sck;
};
#endif // ndef GAME_H
// socket.h
#ifndef SOCKET_H
#define SOCKET_H
#include "game_fwd.h"
class socket {
game* m_game;
};
#endif // ndef SOCKET_H
Очевидно, чтобы это работало, важно разделить интерфейс и реализацию.
Для полноты другая альтернатива:
#pragma once
наверху файла.
Это имеет преимущество, что файл неоднократно не открывается, сохраняя время компиляции.
Это имеет недостаток того, чтобы не быть стандартным, таким образом, не все компиляторы поддерживают его. Работы надежно в Visual C++.
В дополнение к методам (передают определение и читают однажды заголовки), необходимо разработать, почему заголовок сокета требует чего-либо от игрового заголовка, и упакуйте систему в модули с единственным порядком зависимости. Не должно быть никакой причины, которую должен знать класс сокета, о какой игре это используется для.
Нет никакого изящного пути вокруг этого, что я могу думать - Ваш лучший выбор состоит в том, чтобы передать - определяют функции, которые будут на самом деле использоваться. Так, если game.h только использует подключение () функция от socket.h, добавьте эту строку к game.h:
void connect();
И удалите импорт socket.h. Конечно, если подпись подключения () изменится, то необходимо будет не забыть обновлять вперед определение также, таким образом, это решение будет далеко от идеала. Если Вы возможно можете, изменить дизайн для предотвращения круговых зависимостей.
Если game.h просто должен знать о классе в socket.h, вперед определите его как это:
class Socket;
Существуют некоторые протесты когда дело доходит до подставляемых функций и членских объектов, видят Облегченный FAQ C++.
@lassevk, не был должен, это быть "заголовочным файлом будет несколько раз открываться, но препроцессор только считает содержание файла между #ifndef и #endif однажды, во время первого чтения. После того, как затем препроцессор проигнорирует bewteen макросы PP, потому что _GAME_H был определен".