Я могу думать о трех опциях:
RFC 2217 покрывает COM-порт к стандарту TCP/IP, который позволяет клиенту в одной системе эмулировать последовательный порт к локальным программам при прозрачной отправке и получении сигналов данных и сигналов управления к серверу в другой системе, которая на самом деле имеет последовательный порт. Вот общий обзор .
то, Что Вы сделали бы, является находкой, или реализуйте клиентский драйвер COM-порта, который реализовал бы сторону клиента системы на Вашем ПК - кажущийся быть реальным последовательным портом, но в действительности доставляющий все в челноке к серверу. Вы могли бы быть в состоянии получить этот драйвер бесплатно от Digi, Lantronix, и т.д. в поддержку их реальных автономных серверов последовательного порта.
Вы тогда реализовали бы сторону сервера соединения локально в другой программе - разрешение клиенту соединиться и издание данных и команд управления по мере необходимости.
Это, вероятно, не тривиально, но RFC там, и Вы могли бы быть в состоянии найти проект с открытым исходным кодом, который реализует одну или обе стороны соединения.
последовательного порта Linux, источник драйвера последовательного порта для Linux легко доступен. Возьмите это, разрушьте аппаратные части управления и имейте тот один драйвер, выполненный два/dev/ttySx порта как простая обратная петля. Тогда подключите свою реальную программу к ttyS2 и свое средство моделирования к другому ttySx.
, Но самая легкая вещь сделать прямо сейчас? Потратьте 40$ на два USB-устройства последовательного порта, соедините их проводом вместе (нуль-модем) и на самом деле имейте два реальных последовательных порта - один для программы, которую Вы тестируете, один для Вашего средства моделирования.
-Adam
Вы можете попробовать это, используя apply ()
function
> d
name plate value1 value2
1 A P1 1 100
2 B P2 2 200
3 C P3 3 300
> f <- function(x, output) {
wellName <- x[1]
plateName <- x[2]
wellID <- 1
print(paste(wellID, x[3], x[4], sep=","))
cat(paste(wellID, x[3], x[4], sep=","), file= output, append = T, fill = T)
}
> apply(d, 1, f, output = 'outputfile')
Вы можете использовать функцию by ()
:
by(dataFrame, 1:nrow(dataFrame), function(row) dostuff)
Но повторение строк напрямую, как это, редко бывает тем, что вам нужно; вместо этого вам следует попробовать векторизовать. Могу я спросить, что на самом деле происходит в цикле?
Во-первых, точка зрения Джонатана о векторизации верна. Если ваша функция getWellID () векторизована, вы можете пропустить цикл и просто использовать cat или write.csv:
write.csv(data.frame(wellid=getWellID(well$name, well$plate),
value1=well$value1, value2=well$value2), file=outputFile)
Если getWellID () не векторизован, то рекомендация Джонатана использовать от
или knguyen's предложение применить
должно работать.
В противном случае, если вы действительно хотите использовать для
, вы можете сделать что-то вроде этого:
for(i in 1:nrow(dataFrame)) {
row <- dataFrame[i,]
# do stuff with row
}
Вы также можете попробовать использовать пакет foreach
, хотя для этого вам потребуется ознакомьтесь с этим синтаксисом. Вот простой пример:
library(foreach)
d <- data.frame(x=1:10, y=rnorm(10))
s <- foreach(d=iter(d, by='row'), .combine=rbind) %dopar% d
Последний вариант - использовать функцию из пакета plyr
, и в этом случае соглашение будет очень похоже на функцию apply.
library(plyr)
ddply(dataFrame, .(x), function(x) { # do stuff })